C# DDD中的打包存储库及其接口

C# DDD中的打包存储库及其接口,c#,domain-driven-design,ddd-repositories,C#,Domain Driven Design,Ddd Repositories,在我工作过的DDD之后的应用程序中,我们倾向于有一个服务层,其中包含服务+存储库+存储库和服务的接口,它们都位于同一个程序集中,而域模型将位于不同的程序集中。在这个大项目中,感觉所有不符合领域模型的东西都杂乱无章 在遵循DDD原则和模式的应用程序中,如何打包存储库及其实现的接口?打包DDD应用程序的不同逻辑部分(或一般打包)的最佳实践是什么?每个逻辑分区都应该存在于自己的程序集中吗?这有关系吗?我会看看洋葱的架构。基本上,域服务的所有域模型和接口都被视为核心。层仅依赖于其上方更靠近核心的层。它们

在我工作过的DDD之后的应用程序中,我们倾向于有一个服务层,其中包含服务+存储库+存储库和服务的接口,它们都位于同一个程序集中,而域模型将位于不同的程序集中。在这个大项目中,感觉所有不符合领域模型的东西都杂乱无章


在遵循DDD原则和模式的应用程序中,如何打包存储库及其实现的接口?打包DDD应用程序的不同逻辑部分(或一般打包)的最佳实践是什么?每个逻辑分区都应该存在于自己的程序集中吗?这有关系吗?

我会看看洋葱的架构。基本上,域服务的所有域模型和接口都被视为核心。层仅依赖于其上方更靠近核心的层。它们的实际实现由基础设施来处理

看这里

最终,您的接口定义了您的应用程序。如何实现的逻辑是外部化的。因此,我希望您拥有具有域模型和域服务的程序集、前端(如MVC等),然后是实现NHibernate之类的基础架构程序集,以提供数据等

您可以在链接文章的各个部分中看到实现该体系结构的各种示例。最简单的就是这里

你可以在这里看到与之相关的问题


主要的好处是,最经常改变的主要是基础设施问题。新的数据层技术、新的文件存储等等。此外,您的核心域应该相当稳定,因为它没有实现任何东西,只是通过合同(接口)定义它所需要的东西。通过将实施问题放在一个位置,您可以最大限度地减少整个程序集所需的更改量。

您可以在中找到设计层的指导原则。你基本上有:

  • 领域
  • 基础设施
  • 应用
  • 用户界面
服务分为3种:应用层服务、基础设施层服务和域层服务,具体取决于服务的功能。至于存储库,它们的契约(接口)通常位于域中,而它们的具体实现位于基础架构层


关于组件,我建议每层至少一个。程序集和dll都是关于可重用性、关注点分离和解耦的——我是否能够选择该dll并将其丢弃以在另一个应用程序中重用它?我是否能够做到这一点,而不必拖拽一些不相关的特性,这些特性会给其他应用程序带来不必要的复杂性?通过在依赖项注入模块中更改一行代码,我是否能够轻松地将我的dll替换为另一个dll?诸如此类。

对洋葱架构的伟大参考,我一点都不知道。谢谢