Как сохранить разделение проблем при использовании сетки на уровне представления (особенно .NET)?

В трехуровневой модели (уровни доступа к бизнес-данным, презентации) я могу постоянно сохранять свои нижние уровни независимыми от верхних. Например, мой уровень доступа к данным никогда не знает, как он представлен или какие бизнес-правила на нем действуют. Мои бизнес-правила не зависят от того, как они представлены.

Но я должен молиться Деметре о прощении или, по крайней мере, попросить совета у других участников Stackoverflow по одному вопросу: как вы представляете «Таблицу» пользователю, не ссылаясь на объект доступа к данным на уровне представления? Снова и снова я обращаюсь к ADO.NET DataTable в объекте GridView. В настоящее время я использую сторонние инструменты на обоих уровнях. Таблица взята из объекта OpenComponents Table OpenLink; сетка - это Infragistics UltraGrid (платформа Windows). Тем не менее, я виновен в том же нарушении.

edit: Меня особенно интересует, как это можно сделать с помощью WinForm 3.5 .NET. Обратите внимание на мои комментарии ниже: я считаю, что ссылка в комментарии - это то, что я должен был сделать, но я надеялся, что мне не придется слишком увлекаться объектами домена. Я не хочу, чтобы меня обвиняли в чрезмерном проектировании. Это хороший баланс?


person Blanthor    schedule 20.02.2010    source источник
comment
если вы укажете технологию, которую планируете использовать, ответчики могут предоставить немного более подробную информацию о деталях реализации.   -  person MedicineMan    schedule 21.02.2010
comment
Я ограничен Windows Forms .NET 3.5. Объектами базы данных являются таблицы памяти OpenComponents, которые относятся к сфере финансов и торговли нефтью и газом. Думаю, это могло быть то, что мне следовало прочитать в первую очередь. Как: получить доступ к объектам, привязанным к строкам DataGridView Windows Forms (msdn.microsoft.com/ en-us / library / 4wszzzc7.aspx)   -  person Blanthor    schedule 22.02.2010


Ответы (3)


Вместо того, чтобы использовать тип данных, представляющий таблицу, я бы использовал объект передачи данных. Это будет объект, представляющий логическую структуру данных. Он не будет содержать ничего, кроме данных.

В этом случае я бы определил DTO для своего типа «строка данных», а затем использовал бы List<RowDTO> в качестве типа, который я передал бы сетке.

person John Saunders    schedule 22.02.2010
comment
Я был удивлен, насколько это просто. В сетке автоматически отображаются столбцы для каждого общедоступного свойства без добавления атрибутов. С добавлением небольшой сложности у меня теперь есть полезный SoC, с которым я могу работать. - person Blanthor; 23.02.2010

Я не уверен, как это сделали бы другие члены stackoverflow, но в WPF, ASP MVC, Silverlight вы бы использовали шаблон проектирования MVVM. Боюсь, у меня сейчас нет для вас хороших ссылок.

В MVVM ключевая идея состоит в том, что ваше представление получает доступ к данным в ViewModel. ViewModel представляет данные View, открывая свойства. В WPF и Silverlight вы используете привязку для доступа к данным и шаблоны данных, чтобы точно выразить детали того, как это выразить. Обычно вы открываете коллекцию с помощью ObservableCollection. В ASP MVC вы должны переключить контекст и получить доступ к модели таким образом.

<body> <h1><% Model.MyHeaderMessage %></h1>

Я бы сказал, что то, что вы должны сделать, - это в вашей ViewModel (аналогично контроллеру) попасть на сервер / службу для данных и вернуть набор записей. Переупакуйте данные в простые классы данных и поместите их в ObservableCollection, и представьте это представлению через свойство, которое возвращает ObservableCollection. Если вы выполняете ASP MVC, предоставьте данные через свойство, которое возвращает IEnumerable.

person MedicineMan    schedule 21.02.2010

Очень распространенным шаблоном для этого является шаблон Model View Presenter (MVP).

Ключевым моментом здесь является определение интерфейса, который будет представлять ваше представление. Например, у вашего представления может быть свойство.

И докладчик, который должен отвечать за связь между представлением и моделью.

Таким образом, представление будет примерно таким:

internal interface IListClientsView
{
    public string Title { set; }
    public IList<Client> Clients { set; }
}

И реализация в веб-форме будет такой:

public partial class WebForm1 : System.Web.UI.Page, IListClientsView
{
    ListClientsPresenter presenter;
    protected void Page_Load(object sender, EventArgs e)
    {
        presenter = new ListClientsPresenter(this);
        if (!Page.IsPostBack)
            presenter.LoadView();
    }

    public IList<Client> Clients
    {
        set { GrvClients.DataSource = value;
        GrvClients.DataBind();
        }
    }
}

Конечно, это также может быть WinForm. Ключ в том, чтобы просто добавить WinForm к интерфейсу IxxxView и вызвать соответствующего ведущего. Ведущий будет выглядеть так:

public class ListClientsPresenter
{
    IListClientsView View;
    public ListClientsPresenter(IListClientsView view)
    {
        this.View = view;
    }

    public void LoadView()
    {
        View.Title = "List of Clients";
        View.Clients = new List<Client> { 
            new Client {Name = "Client 1"},
            new Client {Name = "Client 2"}
        };
    }
}

Это очень простой пример, вам следует проверить эту статью: http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

person thitemple    schedule 22.02.2010
comment
Изначально я боялся добавить в проект такого рода сложности. Прочитав больше об этом шаблоне, я могу провести рефакторинг до MVP. Я заметил, что пример Boodhoo использует в модели DTO. - person Blanthor; 23.02.2010
comment
В наши дни очень распространенным шаблоном является MVVM Model-View-ViewModel, в котором вместо использования DTO вы создаете класс, известный как класс ViewModel, для представления вашего интерфейса. Это вариант, хотя я предпочитаю использовать MVP, но это всего лишь мнение, вы должны выбрать то, что лучше всего для вас. Ведь серебряных пуль не бывает;) - person thitemple; 23.02.2010