2011-03-31 49 views
0

请帮助选择正确的方式来使用n层web应用程序中的实体。 就目前而言我在它下面assembleis:请帮助选择正确的n层Web应用程序的架构

enter image description here

  1. 模型(自定义实体)描述了类应用程序使用的领域。
  2. 验证使用反射属性方法验证UI中的数据完整性(检查所有图层中的数据)。
  3. BusinessLogicLayer是使用DataAccessLayer中的抽象数据提供程序的附加逻辑和高速缓存的业务外观。
  4. DataAccessLayer使用LinqtoSql数据上下文和Linq查询覆盖abstarct数据提供程序。这里有一点让我觉得自己出错了...... 我的DataLayer在将数据发送到业务层之前,使用映射器将从数据库检索到的数据映射(转换)为模型类(自定义实体)。它看起来像这样:

    internal static model.City ToModel(this City city) 
    { 
        if (city == null) 
        { 
         return null; 
        } 
    
        return new model.City 
        { 
         Id = city.CountryId, 
         CountryId = city.CountryId, 
         AddedDate = city.AddedDate, 
         AddedBy = city.AddedBy, 
         Title = city.Title 
        }; 
    } 
    

所以映射器映射数据对象的描述模型。这是正确和常用的方式来处理实体,还是必须将数据对象用作实体(以获得时间)?我清楚了吗?

回答

1

从服务边界(WCF服务等)发出DTO可能是一种常见的做法,但如果您直接在您的演示模型中使用您的“实体”,我认为没有任何好处。

至于你提供的代码片段,为什么不使用AutoMappter?它有助于消除锅炉板映射代码的写作,并为您提供帮助,如果您有一套惯例的话。

+0

问题不在于映射器本身。问题是关于使用模型的必要性 – Roman 2011-03-31 10:32:37

+0

更新了答案。 – 2011-03-31 10:33:44

2

如果你的项目是POCO,你可以在你的项目中使用你的数据实体。否则,我会像你所做的那样创建单独的模型。但是请将它们保存在单独的程序集中(不在DataAccess项目中)

但我不会通过web服务公开它们。

其他建议

恕我直言的人滥用层。大多数应用程序不需要很多层。我目前的客户有一个像您的应用程序一样的架构。问题是只有数据访问层和表示层在其中存在逻辑,所有其他层仅从下层获取数据,对其进行转换并将其发送到上面的层。

我做的第一件事就是告诉他们放弃所有层,而使用这样的事情(需要IoC容器):(通过一个ORM包含业务规则和数据访问)

  • 核心
  • 规格(分隔接口模式。包含的服务接口和模型)
  • 用户界面(可能是一个Web服务,的WinForms,Web应用程序)

,对于大多数申请工作ication。如果您发现核心增长并变得太大,您可以分割它而不影响任何用户界面。

您已经在使用ORM,并且您是否考虑过使用验证块(FluentValidation或DataAnnotations)进行验证?使您可以轻松验证所有图层中的模型。

0

现在摆脱模型,之后删除它将需要重构整个应用程序。我最后一个项目使用了这个架构,并且维护DTO层和映射到数据库模型层是一个巨大的痛苦,并且没有提供任何有用的好处。令人厌烦的主要事情之一是LinkToSql无法有效支持断开连接的数据模型。您无法通过创建具有与现有记录匹配的主键的新数据库实体来更新数据库表,然后将其粘贴到数据上下文中。您必须首先从数据库中检索实体,更新它然后提交更改。管理这个会导致非常讨厌的更新方法,将所有属性从DTO映射到LinqtoSql类。它也打破了LinqToSql的整个延期执行模型。甚至没有让我开始讨论它是由父类的属性引起的问题,这些父类是子DTO的集合(例如,一个订单属性包含订单DTO集合的客户DTO),管理这些映射真的非常烦琐,我必须做一些广泛的优化,因为检索几百条记录最终导致LinqToSql进行200,000次数据库调用(诚然,也有一些非常笨拙的代码,但你得到的图片)。

使用DTO的唯一正当理由是如果您想要有多个可插入数据访问层例如LinqToSql和NHibernate支持不同的数据库服务器。这样,您可以在以后更换数据访问,而无需更改任何其他图层。如果你不需要这样做,那就救一个痛苦的世界,然后使用LinqToSql实体。