首先,将项目拆分为更多的程序集会增加编译时间和维护工作。所以不要因为你能做到就分裂。在要隔离概念的地方拆分。
再说一次,将项目拆分为程序集有助于理解和具体化依赖关系。例如,您不能在项目之间建立循环依赖关系,而没有什么能阻止您在单个项目中建立循环依赖关系。这些循环依赖可能表明您的设计存在缺陷。
另一件事:如果你分裂,试着想想你是如何分裂的——“垂直”或“水平”。考虑一个由多个子域(如销售、CRM 和 ERP)组成的应用程序。
垂直:将层隔离到组件中。将所有存储库放在一个程序集中,将所有域逻辑放在另一个程序集中,将所有服务放在第三个程序集中,这当然有助于理解我上面提到的依赖关系。但这意味着您将系统中的每个独立域分布在所有程序集中。IE。每个组件都包含销售、CRM、ERP 所需的逻辑。
水平:将域/域部分隔离到程序集中。例如,将与销售相关的所有内容放在一个组件中,将与 CRM 相关的所有内容放在另一个组件中,将与 ERP 相关的所有内容放在第三个组件中等等。所有这些组件需要或需要在它们之间共享的概念都转移到了基础设施项目中。这种方法有助于隔离功能。
您可以结合这两种策略,这就是您的建议:
Company.Services.Workflow
Company.Services.SharePoint
Company.Services.Clinical
“Company.Services”是垂直拆分,而我认为“.Workflow”、“.SharePoint”、“.Clinical”是水平拆分。这很容易导致大量项目,基本上是 NxM,其中 N 是层数,M 是域数。我会小心的。
就我个人而言,我喜欢垂直拆分,将(子)域隔离到项目中,并将基础设施/共享概念转移到他们自己的项目中。
这种方法支持重用和可配置的产品线,其中不同的客户接收不同的项目配置。
基础设施项目可以被其他项目重用,这很好。并且可以根据需要将子域项目组合成一个完整的应用程序。例如,仅当应用程序需要 CRM 功能时才部署 CRM 模块。
一个具体的例子,我有一个更大的项目,包括:
基础设施:
- Company.Commons
- 公司.域名
- 公司.消息
- 公司.坚持
- 公司.Web.Mvc
- 等等
域:
- 公司.销售
- 公司CRM
- 公司.ERP
- 公司.POS
- 等等
注意:域项目之间可能存在依赖关系,例如销售模块使用来自 CRM 的东西。
最后一点:再一次,不要为了吐口水而分裂。如果项目足够大并且您有某些要求(可重用性,可配置性......),这是最有意义的。