【问题标题】:Are DTOs needed when the entire web app will reside on a single server?当整个 Web 应用程序驻留在单个服务器上时,是否需要 DTO?
【发布时间】:2012-05-13 13:53:49
【问题描述】:

我已经开始开发一个 WebForms(不是 MVC)应用程序,它将驻留在单个服务器(包括数据库)上,并决定使用(我认为)非常标准的 N 层架构来设计它。

数据层

  • 使用 Entity Framework 4 和通用存储库/工作单元模式。
  • 将广泛使用存储过程(这是权力赋予我的要求)。
  • 持有对业务对象层的引用,以将数据传入/传出 BO。

业务对象“层”

  • 代码优先 POCO。
  • 他们将拥有的唯一行为是验证内容(名称不为空,数量必须为正整数等)。
  • 不引用任何其他层,也不关心数据的来源。

业务逻辑层

  • 包含我的业务服务,它将充当 UI 和数据层之间的中间人,并执行其他业务“规则”,例如记录更改时的电子邮件通知等。
  • 引用了数据层和业务对象层。
  • 向/从 UI 传递 BO。

界面层

  • 包含所有常见的 UI 内容 - Web 表单、javascript、样式表等。
  • 引用业务逻辑和业务对象层。

几个问题...嗯,其实很多:/

  1. 当应用程序要跨越多个服务器,将使用 Web 服务,或者当传递给视图的数据是多种类型的业务对象的编译时,我可以看到使用 DTO 的优势,但真的存在吗?当所有东西都在同一台物理机器上时,是否需要将所有 BO 转换为 DTO,然后再在 BLL 和 UI 之间传递它们?大多数 DTO 都是“复制、粘贴、将“DTO”添加到类名末尾”的事情,所以这似乎是一种毫无意义的浪费时间?我最终得到的只是更高的维护成本和略微降低的性能(现在必须用相同的代码更新两个类,而不是一个)。
  2. 假设在某些情况下需要 DTO,是否可以向 DTO 添加验证(即:名称不能为空,数量必须是正整数等)?
  3. 最好/更好的做法是使用 FluentValidation 之类的东西将验证代码分离到它自己的类库中吗?如果我这样做,BO 基本上会变成 DTO,因为它们的行为为零。在这种情况下,我似乎最终会得到一个贫乏的域模型?
  4. EF 使用 BO 时,数据层引用业务对象层是否可以接受?
  5. 看到我的服务“Find(predicate)”和“FindAll()”方法将使用相同的存储过程(提取所有记录),这是否意味着执行以下操作:

    List<Foo> myFoo = FooService.Find( f => f.Country == "Australia" && f.Status = OrderStatus.New );
    

实际上会通过存储过程提取所有记录,并在事后执行过滤吗?在这种情况下,如何使用只检索所需记录的存储过程,同时允许使用 linq 表达式(需要允许 &&、||、!= 等)?这甚至是可能的吗(无需放弃存储过程)?

【问题讨论】:

  • 欢迎。这些都是有效的问题,但恐怕在这种形式下,您的问题不符合 Stack Overflow 的问答格式。人们喜欢这里每个帖子的一 (1) 个可回答问题,可以以一 (1) 个答案可以被接受为最佳答案的方式来回答。没有讨论。因此,您最好重新表述您的问题,以包含一个简洁的问题和您需要帮助的代码。或者找一个论坛来讨论你的架构。
  • nps,会用 5 个单独的问题向 SO 发送垃圾邮件。干杯:)
  • 好吧,first one 肯定不是垃圾邮件 :)。干得好。

标签: c# entity-framework dto n-tier-architecture


【解决方案1】:

如果它是一个单体应用程序,我认为它是一个过度架构。 在 YAGNI 和 DRY 之后,只需让您的服务返回 BO。我还建议在使用 WebForms 时使用 MVP 模式,甚至避免使用“服务层”,而只使用领域驱动设计 (DDD)。

http://en.wikipedia.org/wiki/Domain-driven_design

http://en.wikipedia.org/wiki/Don't_repeat_yourself

http://en.wikipedia.org/wiki/You_ain't_gonna_need_it

http://www.codeproject.com/Articles/23562/Building-an-MVP-Framework-for-NET-Part-1-The-Basic

MVP 真的很容易实现。解释总是充满组件和箭头,示例实现总是试图让事情变得复杂(我不知道为什么),但它确实是一种简单的关注点分离模式,它确实有效:)

希望对你有帮助:)

【讨论】:

  • 哈哈我完全忘记了我发布了这个问题。在我有幸偶然发现 5000 行代码隐藏后,我最终采用了 MVP 方法。在 MVP、FluentAPI(而不是数据注释)和一个很好的业务服务层之间,代码已经清理得非常好。进行更改以适应不断变化的业务需求是一件轻而易举的事(这是一个很棒的项目,其中的要求取决于你问的人、天气情况、谁赢得了足球冠军以及你穿什么颜色的毛衣) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多