域驱动设计 - 作为一组 nuget 包实现?

Domain Driven Design - Implementation as a set of nuget packages?

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

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

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

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

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

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

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

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

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

  • 避免一劳永逸的方法。不要在第一天就从共享域开始。您可以从为一个区域/应用程序实施整个域开始。

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

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

  • "common" 业务层可以只是聚合、实体、值对象等的一组抽象 classes

  • 确保您的 "common" 代码具有适当的测试覆盖率。

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

  • 除了Aggregate以外的域模型中的methods/behaviors通常是internal。将methods/behavior移动到常见的 NuGet 包。使它们成为 public 意味着可以从外部修改域模型。您可能需要使它们 protected 然后让应用程序中的派生 class 继承 Domain 对象。

  • 曾经,您对将公共域项目作为 Nuget 包移动到单独的解决方案感到满意。