Ale*_*x J 5 .net assemblies domain-driven-design project-organization
我有一个中型项目,实现了大约20个左右的不同概念.一开始,我选择基于概念层组织我的程序集,如下所示:
MyProject.Domain.dll (References System.Data.Linq, etc.)
\ConceptA\
\ConceptB\
\ConceptC\
\...\
MyProject.Presentation.dll
\ConceptA\
\ConceptB\
\ConceptC\
\...\
MyProject.WinForms.dll (References System.Windows.Forms, etc.)
\ConceptA\
\ConceptB\
\ConceptC\
\...\
MyProject.App.exe (References all the above)
Run Code Online (Sandbox Code Playgroud)
我最近读了一本DDD书,我应该根据它所代表的领域概念而不是技术层对我的程序集进行分组,如下所示:
MyProject.ConceptA.dll (References System.Data.Linq, System.Windows.Forms, etc.)
\Domain\
\Presentation\
\WinForms\
MyProject.ConceptB.dll
\Domain\
\Presentation\
\WinForms\
MyProject.ConceptC.dll
\Domain\
\Presentation\
\WinForms\
MyProject.App.exe (References all the above)
Run Code Online (Sandbox Code Playgroud)
从长远来看,我没有足够的经验来判断这两种方法.我希望在复杂性和灵活性之间取得最佳平衡.我有一些担忧让我感到矛盾:
MessageBox.Show从我的域层调用.根据您的经验,哪种方法最好?
TL;DR:您应该两者都做,但不要仅仅为了它而将您的项目分成多个程序集。通过将程序集拆分为可重用的组件,您最终将在适当的情况下结合使用这两种方法。
首先,我想说,根据项目的大小,可能不需要将概念或层分离到单独的程序集中 - 将代码分离到单独的程序集中的优点是双重的:
如果您不需要这两者中的任何一个(并且您将来也不会需要),那么请保持简单的生活并将所有内容整合到一个组件中。
其次,将代码分离到单独的程序集中的主要原因是重用该代码 - 例如,如果您在 Windows 窗体应用程序中使用一段处理逻辑,则将其分离到单独的程序集中可以让您重用控制台或 Web 应用程序中的逻辑。出于这个原因,我通常发现最好的方法是区分概念,例如:
Company.Project.Concept.dll
Run Code Online (Sandbox Code Playgroud)
其中“概念”是您想要重复使用的东西,无论是一组常见的 Windows 控件还是一些数据访问逻辑。
请注意,当重用一个概念时,很少有人想要重用该概念的所有概念层(域/表示/WinForms)。通常,您的概念仅包含 1 层(例如某种形式的处理),或者当重新使用该概念时,您只对 1 层或可能 2 层感兴趣。在这种情况下,如果您的“概念”程序集还包含其他额外逻辑(例如 WinForms),您只是引用永远不会使用的额外代码。因此,如果有概念层,也可以将其分成概念层,例如:
Company.Project.Concept.Processing.dll
Company.Project.Concept.WinForms.dll
Run Code Online (Sandbox Code Playgroud)
即在你给出的例子中,我主张如果有什么的话你会想要 9 个程序集,而不是 3 个:
MyProject.ConceptA.Domain.dll
MyProject.ConceptA.Presentation.dll
MyProject.ConceptA.WinForms.dll
Run Code Online (Sandbox Code Playgroud)
当然,将您的项目拆分为数百个程序集是完全没有意义的,除非这些单独的概念实际上将在其他地方使用,这让我回到我的第一点 - 不要费心拆分程序集,除非您确实需要,或者把它放在一起另一种方法是将您的程序集拆分为有意义的可重用组件:
作为一个工作示例,我自动选择将较小的项目拆分为两个程序集 - 应用程序本身包含所有“演示文稿”(无论是 Web、WinForms、WPF 还是控制台应用程序),另一个程序集包含应用程序的“内容”应用程序 - 应用程序公开的底层功能(例如图像处理、数据检索等)。如果我想在不同风格的应用程序中公开相同的功能,这会很有帮助。
不过,我还是会犯错误,即程序集太少而不是太多——将一个程序集一分为二比将两个程序集重新组合成一个更容易。 除非您能找到令人信服的理由将程序集/项目拆分为多个程序集,否则不要打扰。