域驱动设计 - 作为一组 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
不同,Enumeration
class是可以继承的。当您需要在特定实现中扩展 Enumeration
时,这会很有用。
除了Aggregate
以外的域模型中的methods/behaviors通常是internal
。将methods/behavior移动到常见的 NuGet 包。使它们成为 public
意味着可以从外部修改域模型。您可能需要使它们 protected
然后让应用程序中的派生 class 继承 Domain 对象。
曾经,您对将公共域项目作为 Nuget 包移动到单独的解决方案感到满意。
我生活并宣扬 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
不同,Enumeration
class是可以继承的。当您需要在特定实现中扩展Enumeration
时,这会很有用。除了
Aggregate
以外的域模型中的methods/behaviors通常是internal
。将methods/behavior移动到常见的 NuGet 包。使它们成为public
意味着可以从外部修改域模型。您可能需要使它们protected
然后让应用程序中的派生 class 继承 Domain 对象。曾经,您对将公共域项目作为 Nuget 包移动到单独的解决方案感到满意。