【问题标题】:DDD or old fashion?DDD 还是旧时尚?
【发布时间】:2009-07-20 16:50:38
【问题描述】:

我们即将设计一个使用 asp.net 的租车预订网站。应用程序将扩大规模有一个变化,我想知道如果使用 DDD 有助于维护和性能会怎样。我想知道是否有使用数据集和 SP 或 DDD 设计的新的类似网站。所以我的朋友们是去 DDD 还是走老路?

【问题讨论】:

  • 谁说不能两者兼得? DDD 是关于业务逻辑的设计,即 /domain/。无论您如何设计业务逻辑,数据集和 SP 都不应考虑到这一点。
  • 通常 ddd 位于 O/R 映射工具之上。当然我们可以两者都做,但我相信像 nhibernate 这样成熟的 o/r 映射器会比我们的自定义映射器做得更好。对不对?

标签: asp.net oop domain-driven-design


【解决方案1】:

和你一样,我正在创建一个新项目,我选择了 DDD 方式,我确信它比“旧时尚”方式更好(解耦和更好的可测试性)......但我必须承认我正在为一些问题而苦苦挣扎,并且不能总是找到答案......即使在 stackoverflow.com 上

例如,聚合根的概念与 ASP.NET MVC 网站的设计(主/细节关系 - 创建/更新);模型绑定与复杂对象图,包括实体对象和值对象等。所有这些都是最近的概念,甚至大师(如DDD的Eric Evans)也不知道所有答案。

最后,我认为社区项目S#arp Architecture是一个非常适合学习的地方,asking questions

【讨论】:

  • MVC 模式是关于表现的。它应该与域模型解耦。如果您正在验证 http-posted 字符串在域模型中的日期时间格式是否正确,那么您做错了。如果您在域模型中添加与分页相关的内容,那也是错误的。
  • 通常你只绑定模型->view_model 方向(Automapper 是一个很好的工具)。有时您根本不需要视图模型(如果域对象本质上是扁平且愚蠢的数据包)。
  • 如果您在视图模型->域模型方向上进行绑定,您会将设计推向程序代码,这很糟糕,除非您尝试解决的问题非常容易(然后程序代码更短,更容易理解)。面向对象的重点是通过将责任委托给“底层”对象来降低复杂性。所以 - 相反,你应该在你的域对象上调用方法,传递相应的参数。
【解决方案2】:

“想知道使用 DDD 是否有助于维护和性能。”

一堆东西可以帮助解决这个问题。 TDD/BDD、IoC、像 NHibernate 的良好 OR/M(带 FluentNHibernate 用于配置)...

正确的 DDD 只是创建干净、简单和可维护的软件的支柱之一。但这只是拼图的一部分。如果你只是用管理器类创建一堆贫血的域对象,使用存储过程进行数据访问而忘记依赖注入,那么 DDD 可能会出错......

但如果做得对,DDD 可以为您提供干净清晰的代码:旧西方的程序化意大利面条式代码将消失,您会发现在自己的代码库中移动更容易。可以进行重构(并且变得不那么可怕)。

就个人而言 - 我永远不会接触另一个“老派”代码库,我当然不会那样开始一个新项目。给我一个新建项目,我会要求 ReSharper、NHibernate、FluentNHibernate 和 StructureMap。这就是我所需要的......

【讨论】:

    【解决方案3】:

    是的,可以构建在 DDD 中也表现良好的网站。 DDD 的目标是让域成为您的驱动模型。目前在我们的项目中,我们使用 NHibernate 作为域之上的对象关系映射器。这工作得很好,特别是因为 NHibernate 还支持不同的东西来提高性能,比如二级缓存。 10000+ 用户需要从数据库加载的对象列表只需要一次查询,不同的会话将共享相同的内存缓存。因此,如果您使用 ORM,请确保利用这些缓存优势!

    您还应该考虑的是,对于软件的每个发布周期,您不仅要更新软件(领域模型),而且还需要在领域模型发生变化时更新数据库。但是,这与必须更新 StoredProcs 没有什么不同。

    顺便说一句:即使使用 DDD 和 ORM,仍然存在您可能更喜欢使用 SP 的问题。示例:创建一个新的订单号。如果您的网站上有 10000 多个用户并且多个用户想要创建一个新订单,您必须确保所有订单号保持唯一。我们发现,我们更喜欢 SP 来执行那些高于 ORM 的锁定操作。

    如果您现在有机会尝试 DDD,一定要尝试一下。祝你好运。

    【讨论】:

      【解决方案4】:

      在我看来,DDD 适合使用 ASP.NET MVC 构建的大型网站。但是我提醒说,此时 ASP.NET MVC 平台还相对不成熟。如果您选择使用 DDD,那么我建议您将 ASP.NET MVC、TDD 和存储库模式作为您的技术组合。如果您使用的是标准 WebForm,我不建议使用 DDD。如果您使用的是 SP,那么 DDD 确实不是很好,因为您不能使用存储库模式,因为它依赖于 GetAll、GetByID、Insert、Update、Delete ......并且您可以使用 IQueryable 在 LINQ 中实现的过滤器扩展这些...好吧,如果您使用的是 SP,那么您必须抵消这种结构的全部优势。只是我的看法。

      【讨论】:

      • 实际上我对 nhibernate 几乎没有经验,它对我来说非常有用。我只是想听听一些关于设计一个新项目的想法,该项目有望及时有效,具有良好的性能、可扩展性并且易于维护。所以我同意 Nissan Fan 但我想分享更多关于现代设计的想法。
      • 我认为 NHibernate 是一个非常成熟的解决方案,但是我对实体框架与存储库模式的结合感到非常满意。这与 MVC 一起,TDD 是 .NET 平台上现代架构的顶峰。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多