设计DAL / DataSet / Business Objects

时间:2011-09-24 13:29:46

标签: .net design-patterns database-design data-access-layer

我目前正在设计一个需要访问数据库(SQL Server)的应用程序(.Net WinForms)。

使用数据源向导,Visual Studio会自动为行创建数据集,表和类:

例如,如果我有Customers表,向导将创建“CustomersRow”类,该类继承自Global.System.Data.DataRow,并将相应的字段作为属性。

在我的应用程序中,我需要为Customers类实现其他方法和属性。

如何处理这些生成的类,通过添加方法修改它们?或忽略它们并实现我自己的业务类?

第二个问题:

如何填充我的对象(例如客户列表?)

您是否建议使用数据表/数据集及其方法或构建自己的数据访问层,并且我满足客户列表(客户)?

我在网上搜索时发现了一些模式但不准确。

由于

4 个答案:

答案 0 :(得分:1)

我认为设计模式完全取决于项目的规模以及您希望它如何“未来证明”。有多少用户使用该软件?许多并发用户是否要访问数据?当用户访问数据时,数据应该如何“最新”?

如果它是一个小项目,请保持简单,但允许自己修改它而无需更改整个应用程序。在更大的项目中,在决定设计模式之前询问上述问题是有用的。

无论比例如何,至少创建以下单独的图层都很有用:

DAL - 仅负责更新和检索数据

业务逻辑 - 代表流程软件负责的一组对象和方法(只有业务逻辑可以访问DAL)

UI - 用于向用户呈现数据并根据业务逻辑获取用户的输入(UI引用BL层,并且只能通过它的规则来访问和修改数据)

通过这种方式,您可以修改任何图层而不会影响其他图层,随着项目的增长,它可以变得非常有用。

答案 1 :(得分:0)

我也是设计模式的新手,但我认为最好的解决方案是将Business层放在生成的类和DAL之上。然后在这个层中你可以为你的类实现自定义方法和属性,也许你应该考虑使用POCO对象。

答案 2 :(得分:0)

说到层和层,请保持简单。一些开发人员在涉及业务层时非常学术化,但他们所做的只是增加了不必要的复杂性(谨防architecture astronauts)。因此,我的第一个建议是为您的特定应用程序保持简单易用。

目标是在维护复杂性和灵活性之间取得平衡。您希望您的应用程序具有增长的灵活性,而无需进行大量更改,但同时,您希望能够拥有一个易于理解的应用程序。

在持久性和客户端之间至少有一层是一件好事。这使您可以灵活地在客户端和数据库之间放置域和/或服务。除非你解决一个特定的问题,否则我不会超越这个。

对于从持久性加载,您可以使用部分类来扩展生成的持久性类。这是一种简单的方法,可以在保持原始属性和方法的同时添加其他功能。

如果需要将持久性对象转换为应用程序使用的域对象,我建议在带有持久性对象的域对象上放置构造函数或静态Create方法,然后将其转换为域对象。你可以做同样的事情回到持久性。

using MyApp.Domain;

public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; }
    public int ID { get; set; }

    public static MyApp.Domain.Customer Create( MyApp.Persistence.Customer pcustomer )
    {
        return new MyApp.Domain.Customer
        {
            Name = pcustomer.Name,
            Address = pcustomer.Address,
            ID = pcustomer.ID
        }
    }

    public void Persist( MyApp.Persistence.Customer pcustomer )
    {
         pcustomer.ID = this.ID;
         pcustomer.Name = this.Name;
         pcustomer.Address = this.Address;
    }

}

以下是部分类的外观。关键是让类的名称空间与生成的持久性类型的名称空间相同。

using MyApp.Persistence;

public partial class Customer
{
     public string FormatedAddress
     {
         // I now have access to all the generated members because
         // I'm extending the definition of the generated class
         get
         {
             return string.Format( "{0}\n{1},{2} {3}",
                                   StreetAddress,
                                   City, 
                                   State,
                                   ZipCode );
         }
     }

}

答案 3 :(得分:0)

在这里看看我的另一个答案:

MVC3 and Entity Framework

基本上是MVC,WinForms,WPF或者你所拥有的任何表示层我所描述的分层仍然有效。

您的数据访问层的真实形状可能会在内部发生变化,具体取决于您在那里使用的内容,例如NHibernate,实体框架,除了原始/纯SQL访问之外没有任何ORM,无论您做什么都受限制并包含在那里和您如果你从最大程度上抽象出来并且所有其他层都被设计为独立于它,那么它将拥有美好的生活。