C# 请帮助选择正确的n层web应用程序体系结构

C# 请帮助选择正确的n层web应用程序体系结构,c#,asp.net,n-tier-architecture,C#,Asp.net,N Tier Architecture,请帮助选择在n层web应用程序中使用实体的正确方式。 目前,我有以下组件: 模型(自定义实体)描述应用程序使用的类的字段 验证是使用反射属性方法从UI验证数据完整性(检查所有层中的数据) BusinessLogicLayer是使用DataAccessLayer中的抽象数据提供程序的附加逻辑和缓存的业务外观 DataAccessLayer使用LinqtoSql数据上下文和Linq查询覆盖Abstract数据提供程序。这一点让我觉得我错了。。。 My DataLayer在将数据发送到业务层之前,使

请帮助选择在n层web应用程序中使用实体的正确方式。 目前,我有以下组件:

  • 模型(自定义实体)描述应用程序使用的类的字段
  • 验证是使用反射属性方法从UI验证数据完整性(检查所有层中的数据)
  • BusinessLogicLayer是使用DataAccessLayer中的抽象数据提供程序的附加逻辑和缓存的业务外观
  • DataAccessLayer使用LinqtoSql数据上下文和Linq查询覆盖Abstract数据提供程序。这一点让我觉得我错了。。。 My DataLayer在将数据发送到业务层之前,使用映射器将从DB检索到的数据映射(转换)到模型类(自定义实体)。看起来是这样的:

    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
        };
    }
    

  • 因此,映射器将数据对象映射到描述模型。这是处理实体的正确且常见的方法,还是我必须将数据对象用作实体(以获得时间)?我够清楚了吗

    从serivce boundary(WCF服务等)发送DTO可能是一种常见的做法,但如果您在演示模型中直接使用“实体”,我看不出这样做有任何好处


    至于您提供的代码片段,为什么不使用呢?它有助于消除锅炉板映射代码的编写,如果您有一套约定,它可以帮助您完成这项工作。

    从serivce boundary(WCF服务等)发送DTO可能是一种常见做法,但如果您在表示模型中直接使用“实体”,我看不出这样做有任何好处


    至于您提供的代码片段,为什么不使用呢?它有助于消除锅炉板映射代码的编写,如果您有一套约定,它可以帮助您完成这项工作。

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

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

    其他建议

    我认为人们过度使用图层。大多数应用程序不需要很多层。我当前的客户的所有应用程序都有一个类似于您的体系结构。问题是,只有数据访问层和表示层具有逻辑,所有其他层都只是从较低层获取数据,对其进行转换,然后将其发送到上面的层

    我做的第一件事是告诉他们放弃所有层,而是使用类似的东西(需要一个IoC容器):

    • 核心(包含通过orm的业务规则和数据访问)
    • 规范(单独的接口模式。包含服务接口和模型)
    • 用户界面(可能是Web服务、winforms、webapp)
    这适用于大多数应用程序。如果您发现核心增长过大,无法处理,您可以将其拆分,而不会影响任何用户界面


    您已经在使用ORM,是否考虑过使用验证块(FluentValidation或DataAnnotations)进行验证?使在所有层中验证模型变得容易。

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

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

    其他建议

    我认为人们过度使用图层。大多数应用程序不需要很多层。我当前的客户的所有应用程序都有一个类似于您的体系结构。问题是,只有数据访问层和表示层具有逻辑,所有其他层都只是从较低层获取数据,对其进行转换,然后将其发送到上面的层

    我做的第一件事是告诉他们放弃所有层,而是使用类似的东西(需要一个IoC容器):

    • 核心(包含通过orm的业务规则和数据访问)
    • 规范(单独的接口模式。包含服务接口和模型)
    • 用户界面(可能是Web服务、winforms、webapp)
    这适用于大多数应用程序。如果您发现核心增长过大,无法处理,您可以将其拆分,而不会影响任何用户界面


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

    在以后删除模型之前,立即删除该模型需要重构整个应用程序。我参与的上一个项目使用了这种体系结构,并维护DTO层和到数据库模型层的映射,这是一个巨大的痛苦,没有提供任何有用的好处。一个主要的问题是LinkToSql不能有效地支持断开连接的数据模型。您不能通过创建主键与现有记录匹配的新DB实体,然后将其粘贴到数据上下文中来更新数据库表。您必须首先从数据库中检索实体,更新它,然后提交更改。管理这一点会产生非常糟糕的更新方法,将DTO中的所有属性映射到LinqtoSql类。它还打破了LinqToSql的整个延迟执行模型。不要让我开始讨论它在作为子DTO集合的父类上的属性(例如,具有Orders属性且包含order DTO集合的customer DTO)所引起的问题,管理这些映射确实非常麻烦,我不得不做一些广泛的优化,因为检索几百条记录最终导致LinqToSql进行200000次数据库调用(当然也有som)