在表示层(特别是.NET)中使用网格时,如何保持关注点的分离?

时间:2010-02-20 23:54:06

标签: winforms design-patterns gridview separation-of-concerns law-of-demeter

在三层模型(演示 - 业务 - 数据访问层)中,我可以始终保持下层与上层不可知。例如,我的数据访问层永远不知道它是如何呈现的,或者在其上运行哪些商业规则。我的业务规则不知道它们是如何呈现的。

但我必须向Demeter祈祷原谅或者至少向Stackoverflow的成员寻求一件事的建议:如何在不引用表示层中的数据访问对象的情况下向用户呈现“表”?我一次又一次地发现自己在GridView对象中引用了ADO.NET DataTable。目前我在两个层中都使用第三方工具。该表来自OpenLink的OpenComponents Table对象;网格是Infragistics UltraGrid(Windows平台)。然而,我对同样的违规行为感到内疚。

修改 我对使用WinForm 3.5 .NET可以完成的工作最感兴趣。请注意我的评论如下:我认为评论中的链接是我应该做的,但我希望我不必过于喜欢域对象。我不想被指责过度设计。这是一个很好的平衡吗?

3 个答案:

答案 0 :(得分:1)

我没有使用表示表的数据类型,而是使用数据传输对象。这将是表示数据逻辑结构的对象。它只包含数据。

在这种情况下,我为我的“数据行”类型定义了一个DTO,然后使用List<RowDTO>作为我传递给网格的类型。

答案 1 :(得分:0)

我不确定其他stackoverflow成员会怎么做,但WPF,ASP MVC,Silverlight,你要做的是使用MVVM设计模式。我担心此刻我没有任何好的链接。

在MVVM中,关键的想法是View访问ViewModel中的数据。 ViewModel通过公开属性向View显示数据。在WPF和Silverlight中,您使用绑定来访问数据并使用数据模板来表达如何表达它的确切细节。通常,您将使用ObservableCollection公开一个集合。在ASP MVC中,您可以通过上下文切换和访问模型。

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

我想说你应该做的是在ViewModel(类似于控制器)中点击服务器/服务获取数据,然后返回记录集。在简单数据类中重新打包数据,并将它们放在ObservableCollection中,通过返回ObservableCollection的属性将其公开给视图。如果您正在进行ASP MVC,请通过返回IEnumerable的属性公开数据。

答案 2 :(得分:0)

一种非常常见的模式是模型视图展示器模式(MVP)。

这里的关键是定义一个代表你的View的界面。例如,您的视图可能具有属性。

主持人应负责视图与模型之间的沟通。

所以视图会是这样的:

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