【问题标题】:Domain Driven Design - Implementation as a set of nuget packages?域驱动设计 - 作为一组 nuget 包实现?
【发布时间】:2020-05-14 06:04:23
【问题描述】:

我生活和宣扬 DDD,几乎我开发的每一个项目都以以下形式结束:

- Application Layer
- Business Layer 
- Domain Layer
- Data Layer

这里的每一层都是一组可执行文件或 dll,它们共同构成了应用程序。每个 dll 都以 net48、dotnetcore3.1 和 netstandard2.1 为目标,以实现最大的可重用性。

最近,在一个爱好项目中,我在跨 WPF 应用程序、WebAPI 和一组 Azure Functions 共享组件和定义方面具有可重用性优势。但是现在,我的需求扩展到包括移动(Xamarin)应用程序,所以我想我会将域层移动到一个 nuget 包中,然后将不同的实现引入到不同的应用程序中。这使得重做专门为新的移动应用程序实现的身份验证、日志记录等事情变得很容易,因为域的定义在一个 nuget 包中。

我想知道我的方法是否合理。拥有 nuget 包的好处在一定程度上是好的,但同时,修复小东西或向实体添加属性需要我重新发布和更新版本。单元测试负责逻辑,但我仍然怀念进行良好老式调试的能力。

您对这种方法有何想法和经验?

【问题讨论】:

  • 嘿。有趣的是更多关于不同层代表什么的信息,特别是关于应用程序层和业务层的内容?您认为应用程序是 WebAPI、WPF 等吗?就个人而言,我认为应用程序层是应用程序的服务/网关(包括协调),域端是模型和工厂,它们定义了特定的域参与者(聚合 +)。注意。有多种方法可以解决这个问题,但我想先了解更多。
  • 我通常将所有编排类保留在业务层中(以保持稳定)。这就是我将服务类视为结合验证器和存储库的编排器的方式。对我来说,应用层是实际可执行文件所在的层,一个 ASP.NET 项目、UWP 项目、Xamarin 等。领域层仅包含声明、实体、值类型和在其他地方实现的所有接口。
  • 我问是因为我认为应用程序是服务和域模型的组合。然后 API、WPF 应用程序等成为您实际应用程序的“接口”(插件)。因此,您实际上想要打包应用程序本身。

标签: c# .net architecture nuget domain-driven-design


【解决方案1】:

将域层共享为 NuGet 包(在 DDD 中)正是我们目前正在忙的事情。我说的是一个大型业务解决方案,它有一些“共享”域,然后是特定区域的实现。

共享一个公共域可能是一项艰巨的工作,我建议仅在战略上符合您的业务需求时才采用这种方法。

根据我的经验,我的建议如下:

  • 避免大爆炸式方法。不要在第 1 天从共享域开始。您可以从为一个区域/应用程序实施整个域开始。

  • 请记住,90% 的相同业务域与完全相同的业务域不同。准备好花费大量时间为您的应用程序设计 10% 不同的域:)

  • 识别常用组件。将它们移动到同一解决方案中的单独项目中作为开始。通用组件可能包括通用业务逻辑、基础架构层等。我建议您与您的业务团队一起执行此操作。

  • “通用”业务层可能只是聚合、实体、值对象等的一组抽象类。

  • 确保您的“通用”代码具有适当的测试覆盖率。

  • 避免使用enums。使用Enumeration。与enum 不同,Enumeration 类可以被继承。当您需要在特定实现中扩展 Enumeration 时,这会很有用。

  • Aggregate 之外的域模型中的方法/行为通常为internal。将方法/行为移动到常见的 NuGet 包时需要小心。将它们设为public 意味着可以从外部修改域模型。您可能需要将它们设为protected,然后让应用程序中的派生类继承域对象。

  • 有一次,您对设置感到满意,将公共域项目作为 Nuget 包移动到单独的解决方案中。

【讨论】:

  • 我的应用程序通常有存储库,在接口中声明,并在它们自己的 dll 中实现,即“IProductRepository”和“IAddressRepository”都在域中声明,但在 .data.sqlserver 中实现,所以如果我想将 IAddressRepository 的实现移动到 Azure 存储,我只需在 .data.azurestorage 中实现它。在今天的解决方案中,这可能意味着相当多的 dll - 身份验证、电子邮件传输、消息代理,甚至文件 IO。我对这种方法最大的担忧是调试——你如何处理它?
  • 我认为您的问题更多是关于调试 nuget 包。您可以使用 SourceLink,也可以尝试 Nuget 扩展,例如 NugetReferenceSwitcher github.com/RicoSuter/NuGetReferenceSwitcher。请参阅我的 Nuget Standard and Defaults 帖子,您可能会发现它很有用。 ankitvijay.net/2020/03/29/…
  • 哦,这正是我所需要的,Ankit!非常感谢!
  • 很高兴我能帮上忙 :-)
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多