C# 用C语言组织程序集(程序集结构)#

C# 用C语言组织程序集(程序集结构)#,c#,.net,C#,.net,假设您正在编写一个应用程序,如Photoshop,其中有效果(过滤器),等等,是否应该使用单独的项目将这些过滤器中的每一个制作成单独的程序集 其主要思想是将这些过滤器中的每一个都作为节点,因此可以这样想: sourceImage -> Sharpen -> Darken -> Contrast -> Blur ... 在我看来,拥有如下dll文件是有意义的: [Filters folder] Sharpen.dll Darken.dll Contrast.dl

假设您正在编写一个应用程序,如Photoshop,其中有效果(过滤器),等等,是否应该使用单独的项目将这些过滤器中的每一个制作成单独的程序集

其主要思想是将这些过滤器中的每一个都作为节点,因此可以这样想:

sourceImage -> Sharpen -> Darken -> Contrast -> Blur ...
在我看来,拥有如下dll文件是有意义的:

[Filters folder]   
Sharpen.dll  
Darken.dll
Contrast.dll
Blur.dll
但是这样管理他们会很困难,这会阻止我对类成员使用
internal
关键字,对吗

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


组织程序集的最佳实践是什么?

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


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

我认为更好的方法可能是为该程序集中的类型提供一个具有
锐化
变暗
对比度
、和
模糊
名称空间的过滤器程序集。这实际上完全取决于您需要的每一点功能的模块化程度。

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


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

独立工具的作者Patrick Smacchia建议将部件数量保持在较低的水平。看。这在一定程度上还意味着使用NDepend来管理名称空间之间的依赖关系。 此外,如果程序集较少,则编译速度更快,部署也更容易


我支持Reed Copsey,DI(like)解决方案可以为您提供可扩展性和可测试性,如果这正是您所追求的。

拥有独立程序集的原因:

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

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

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

拥有单独的DLL肯定会让开发人员更容易。我们在这里为一组具有几乎相同的I/O需求和一个公共API的项目(一组数据过滤器)执行此操作。每个开发人员都可以开始做自己的事情,而不用担心构建和冲突。谢谢Jon。我明白你的意思。还有一件事我想知道,如果我说整个应用程序的10个程序集作为同一个解决方案文件中的独立项目,我是否能够在不同的程序集之间使用内部程序集?我记得没有,但我很难从应用程序本身中分离基本功能。所以最后我说,PhotoshopLib.dll和Photoshop.exe。如果你让不同的程序集成为朋友程序集,你可以在它们之间使用internal。看看InternalsVisibleToAttribute。或者首先使用internal不是一个很好的实践,应该被更好的实践所取代。顺便说一句,这不是我的建议。如果业务层需要引用UI,那么可能存在设计问题。但我同意减少集会。(顺便说一句,是的,我意识到已经两年了:))