在C#中组织装配(装配结构)

Joa*_*nge 4 .net c#

假设您正在编写像Photoshop这样的应用程序(过滤器)等,如果使用单独的项目将每个过滤器作为单独的程序集?

主要思想是将每个过滤器作为节点,因此请将其视为:

sourceImage -> Sharpen -> Darken -> Contrast -> Blur ...
Run Code Online (Sandbox Code Playgroud)

在我看来,有这样的dll文件是有道理的:

[Filters folder]   
Sharpen.dll  
Darken.dll
Contrast.dll
Blur.dll
Run Code Online (Sandbox Code Playgroud)

但是很难像那样管理它们,这会阻止我internal对类成员使用关键字,对吧?

所以现在我只有1个dll用于所有过滤器.

组织装配的最佳实践是什么?

Jon*_*eet 7

我不会限制你自己每个组件一个过滤器.您可能希望将实现类似功能的组件(例如颜色/对比度)组合在一起,同时将它们与非常不同类型的过滤器分开(例如边缘增强).

只是一个位的传闻:我经常看到的应用是难以管理,由于有太多的许多组件.我不记得曾经看到一个有问题的因为它没有足够分裂组件.我不是说它不会发生 - 只是我没有看到它.

  • 如果将它们设置为朋友程序集,则可以在不同程序集之间使用内部.查看InternalsVisibleToAttribute. (2认同)

Pet*_*pac 6

NDepend工具的作者Patrick Smacchia表示,组件数量保持较低.你看这里.这也意味着您使用NDepend来管理命名空间之间的依赖关系.此外,如果您拥有更少的程序集并且部署更容易,则编译速度更快.

如果那就是你所追求的那样,那么DI(如StructureMap)解决方案可以为你提供可扩展性和可测试性.


Jes*_*ith 5

有单独组件的原因:

  • 您可以单独部署它们并使用反射(即插件)在运行时加载它们.但要确保这种增加的复杂程度是值得的.
  • 您可以将业务逻辑与UI分离,理论上(偶尔在实践中)具有单独的UI.
  • 您有一个实用程序类库,您可能希望在Windows窗体和ASP.NET应用程序中使用它们.
  • 您可以将业务逻辑放在DLL中,然后使用单元测试的DLL来运行该代码.
  • 除了最后一点,您还可以将某些程序集配置为仅在"调试"或"发布"模式下构建.因此,您可以仅在调试模式下构建单元测试程序集,而不是在发布模式下发送它.或者您可能还有一个仅为Release构建的辅助程序(可能用于安装).

避免单独组装的原因:

  • 它增加了复杂性.不要仅仅根据程序的理论"建模"将代码组织到多个程序集中.确保额外的复杂性实际上为您带来更大的价值.
  • 它减慢了编译/构建速度.
  • 您不能在程序集之间使用循环引用,因此如果您发现程序集需要从更高级别的程序集访问类和方法,则必须跳过大量的环节和"管道抽象".例如,如果您的Windows窗体UI(.exe)程序集调用业务逻辑DLL,则DLL无法引用UI类,而不会在接口和传递层之间传递引用.

我认为这是经验所带来的.我自己的经验是,因为我已经成为一个成熟的.NET开发人员,我已经变得不那么倾向于创造更多的组件,除非有一个非常令人信服的理由.