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

时间:2009-04-08 17:52:41

标签: c# .net

假设你正在编写一个类似Photoshop的应用程序,你有效果(过滤器)等,是否应该使用单独的项目将这些过滤器中的每一个作为单独的程序集?

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

sourceImage -> Sharpen -> Darken -> Contrast -> Blur ...

在我看来,拥有像:

这样的dll文件是有意义的
[Filters folder]   
Sharpen.dll  
Darken.dll
Contrast.dll
Blur.dll

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

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

组织装配的最佳做法是什么?

5 个答案:

答案 0 :(得分:7)

我不会限制自己每个组件使用一个过滤器。您可能希望对实现类似功能的程序集进行分组 - 例如颜色/对比度在一起,同时保持它们与非常不同类型的滤波器分开(例如边缘增强)。

只有一点轶事证据:由于太多许多程序集,我经常看到应用程序难以管理。我不记得曾经看到一个有问题的因为它没有足够分裂组件。我不是说它不会发生 - 只是我没有看到它。

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

拥有单独程序集的原因:

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

避免单独装配的原因:

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

我认为这是经验所带来的。我自己的经验是,随着我作为.NET开发人员的成熟,除非有一个非常令人信服的理由,否则我不太愿意创建更多的程序集。

答案 3 :(得分:3)

我认为更好的方法是为该程序集中的类型设置一个包含SharpenDarkenContrastBlur命名空间的过滤器程序集。这完全取决于您需要每个功能模块的模块化程度。

答案 4 :(得分:0)

使用单独的程序集可以更轻松地添加更多而无需重新编译。特别是,如果您使用某种类型的DI解决方案(如MEF),您可以在运行时加载这些程序集并将它们注入您的程序。

但是,这将要求您的主程序公开适当的公共接口,以便其他程序集可以使用您的类型。内部修饰符变得更加棘手,因为您必须为要访问内部的每个程序集设置内部可见属性。