Visual Studio - DDD模块和洋葱架构

3
我正在开发一个基于DDD和洋葱架构概念的C#应用程序,但我无法理解如何分离代码:
1. 我希望它按模块-有界上下文-(例如销售; 供应商; 客户)进行分离。 2. 我希望它按层(例如核心; 服务)进行分离。
我考虑做以下事情:每个层一个项目,每个模块一个文件夹(具有唯一的命名空间)。例如:
项目核心 - 文件夹销售 - 文件夹供应商 - 文件夹客户
项目服务 - 文件夹销售 - 文件夹供应商 - 文件夹客户
然而,我认为我可以反过来做:每个模块一个项目,每个层一个文件夹。
我不知道是否还有其他方法。
谢谢。

2
是的。没错。DDD 的设计非常注重迭代方法。你第一次就打出全垒打的可能性非常小。这不一定是因为你建模有误,而是由于在实践中,你会从提供规范的人那里学到东西,这将迫使你进行改变。 - MutantNinjaCodeMonkey
1
我通常最初将我的DDD项目组织如下(层/项目): 应用程序 - 由客户端代码或公开客户端代码的服务使用; 持久性 - 数据库实现(EF,nHibernate等); 领域 - 包含领域对象。不知道持久性或应用程序。还托管定义存储库的接口; 服务 - 不真正属于领域的代码(例如供应商API),但被应用程序层使用; - MutantNinjaCodeMonkey
1
根据项目的复杂性和范围,有更多的层次。有时服务不都在一个项目下。有时我需要一些东西来暴露远程调用(例如WebApi或WCF)。有时我会将DTO存储在单独的层中。 - MutantNinjaCodeMonkey
1
通常我会有一个应用层,它不知道客户端如何使用它。WebAPI/MVC层将包装这些调用。如果解决方案中有一个表示层(网站),那么它也将调用应用程序层方法。 - MutantNinjaCodeMonkey
1
如果您希望模块可以独立部署,第二个选项是可行的方法。 - guillaume31
显示剩余5条评论
2个回答

5

在VS中,一个行之有效的方法如下:

  • 为每个模块创建一个项目。 这是一种自然的方法,因为项目之间存在明确的依赖关系。
  • 使用解决方案文件夹将项目分组成层次结构。 您可以使用数字作为前缀,以便在Visual Studio中按顺序显示该层。请注意,解决方案文件夹是虚拟的,即在文件系统中不可见,但通常不是问题。

那么你会有例如Core/Sales、Core/Suppliers、Application/Sales、Application/Suppliers、Infraestructure/Sales、Infraestructure/Suppliers这样的目录结构吗? - Franco
@Franco 如果 SalesSuppliers 是不同的业务组件(根据您的问题我假设是这样),那么这是一个很好的结构。但如果它们是同一业务组件的不同应用程序(前端),则应该创建一个单一的领域模块。此外,在这种情况下,基础架构可能会成为一个模块。 - theDmi
我编辑了问题以澄清模块是BC,谢谢。我喜欢你的方法,但整个解决方案中不会有很多程序集吗?我不知道现在是否需要担心这个实际问题。 - Franco
这是一个权衡,但是一些程序集(如10-20个)并不会有任何影响。但是你需要自己决定权衡的标准!总的来说,我喜欢这个答案作为一个通用的指导方针:https://dev59.com/S3RB5IYBdhLWcg3wn4fb#568789 - theDmi
非常有用,我只是想提前知道。 - Franco

3
根据我之前完成的DDD项目,我总结出以下几点:
  • 每个有界上下文的领域模型都应该放在一个项目中。在DDD中,大家使用相同的语言/模型非常重要。

  • 使用解决方案文件夹来分离层次结构(如TheDmi所述)。

  • 每个层次结构中先从1个项目开始,然后根据需要进行重构。假设你的方法具有某种敏捷性,因此没有必要提前规划整个项目结构。就像你可以重构类一样,也可以重构项目。请记住以下几点:

1)每个项目是否有自己存在的理由。例如,汽车有其存在的理由,我可以购买一辆,更换一辆等等。引擎部件没有单独存在的理由。除非我有与之匹配的汽车,否则我不会购买它。

2)避免代码分析的“此名称空间中的类过少”警告。如果每个品牌只有几种类型的汽车(并且不涉及许多单独的汽车部件),则将整个品牌放入一个项目中。

3)查看单个项目层次结构是否适合在解决方案资源管理器中的屏幕(或2个屏幕)内。一旦您开始搜索项目中已知存在的类,就考虑拆分项目。例如,汽车可以按品牌分开。

让你的解决方案随着项目增长而变得复杂。尽管我见过有100个项目的解决方案,但很少看到它奏效。对于超过100个(也许对于项目稍微多一点)类的项目也是如此。

如果你将其保持在这些范围之间,那么你可能是安全的。

更新 查看项目的代码映射。如果它讲述了一个有意义的故事,那么你就做得很好。如果没有,请尝试找出需要更改的内容。


我喜欢你的品牌和汽车类比。我会记住代码分析。 - Franco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接