Как сохранить разделение задач при использовании сетки на уровне представления (особенно в .NET)? - PullRequest
1 голос
/ 21 февраля 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

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

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

0 голосов
/ 23 февраля 2010

Очень распространенным шаблоном для этого является шаблон Представление модели (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

0 голосов
/ 21 февраля 2010

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

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

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

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

...