.net 具有许多DLL的应用程序是一件坏事吗?
我们有一个enterpise web应用程序,它由4个编译组件(DLL)组成。一年多前,我们开始实施更细粒度的组件,试图隔离功能,减少耦合,降低重新编译和部署大量代码块的风险。虽然没有人认为这种方法在添加新功能和修补bug时为我们提供了更大的灵活性和上市速度,但应用程序现在由近40个DLL组成。我们有一个命名约定,可以很好地识别组件 我的问题是:拥有一个包含许多DLL的应用程序是否存在任何不利因素(性能、维护等?.net 具有许多DLL的应用程序是一件坏事吗?,.net,asp.net,.net,Asp.net,我们有一个enterpise web应用程序,它由4个编译组件(DLL)组成。一年多前,我们开始实施更细粒度的组件,试图隔离功能,减少耦合,降低重新编译和部署大量代码块的风险。虽然没有人认为这种方法在添加新功能和修补bug时为我们提供了更大的灵活性和上市速度,但应用程序现在由近40个DLL组成。我们有一个命名约定,可以很好地识别组件 我的问题是:拥有一个包含许多DLL的应用程序是否存在任何不利因素(性能、维护等? 编辑:我们正在探索将代码重构为更大组件的选项,我认为这可能是某种回归…维护-否,性
编辑:我们正在探索将代码重构为更大组件的选项,我认为这可能是某种回归…维护-否,性能-是。需要加载的程序集越多,应用程序启动越慢。对于需要加载到AppDomain中的每个程序集,加载程序需要执行一系列验证。DLL越多,问题越严重,包括:
- 构建时间:编译器为每个DLL运行一次,DLL必须复制到输出目录中或从中复制
- 加载时间:尽管DLL是按需加载的,但Windows必须单独加载每个DLL文件,因此通常只会为您使用的部件产生成本
- 重定基址:您拥有的DLL越多,两者在虚拟内存中发生冲突的可能性就越大。这不会造成问题,因为Windows可以重新设置其中一个DLL页面的基础,但重新设置基础的过程需要时间,Windows必须提前从磁盘加载任何受影响的DLL页面。重定基址通常不会对托管DLL产生太大影响
- Visual Studio开销:一个DLL=一个项目=IDE的更多工作
DLL过多的缺点是什么?当然 那么多少是太多了 程序集是一种组织方式,就像名称空间和类一样。名称空间定义逻辑边界、程序集和物理边界 您应该尝试保持程序集的一致性,并将它们视为系统模块
是的,如果你有数百个这样的系统,就会有一个(小的)性能问题。但是对于40,我看不出有什么问题。将独立的功能域分离为单个DLL通常是一件好事。它有助于引入重用的可能性,并有助于减少类的内部实现之间引入不适当的耦合 但是,将多个程序集作为系统的一部分也有缺点:
ILMerge的缺点是,它在某些动态加载场景中会失败,例如,通过(字符串)名称创建类型的实例。因此,ILMerge可能可行,也可能不可行,这取决于您的IoC提供商。初始用户将体验到性能提升,但后续用户将不会有相同的体验…正确吗?也可以(取决于您的应用程序体系结构)“根据需要”动态加载这些程序集(即,当功能被访问时,如果有的话!)以允许应用程序最初更快地加载,并给用户更快的整体感知性能提升。@CraigTP没错,我们现在得到了这种“效果”,因为我们通常为“螺栓连接”的“一次性”功能开发组件在核心应用程序的其余部分。用户很少使用这些功能的是“随需应变”本质上是加载。您可以通过禁用项目的“复制本地”功能来缩短构建时间。这可以大大缩短构建时间。Pattrick Smacchia在一篇文章中解释了如何做到这一点:。我现在遵循的大多数程序集/命名空间技术都是从Patrick学到的。应该注意的是,您可以通过使用g InternalsVisibleTo程序集级别属性的优点。应该能够相互引用的程序集,但这些程序集之外的东西不应该,您可以使用internal和have属性使其对另一个程序集可见。@jkohlhepp:True。您也可以为这样一组程序集提供强引用名称以限制可以使用的其他程序集