2009-12-03 157 views
3

我有一个哲学问题,这也需要考虑性能的影响。.NET项目架构

我们正在设计一个新的系统,它有许多不相互关联的子服务,但也有一些可能会互相使用(我们正在使用统一来避免任何解耦)。

我的主要问题是:

  • 我们应该打破他们到不同的DLL的,其中每个服务都有自己的DLL(如product.services.serice1.dll,product.services.serice2.dll等。 ),或者我们应该将所有这些服务整合到一个具有不同名称空间的DLL中以在它们之间分离。 它的表现,两者有什么区别?此外,社区(和微软)认可的最“可接受”标准是什么?

感谢

+0

嗨,大家好,感谢所有的输入;但不是你真的在寻找多个(超过20个)不同dll需要加载的效果,而不是一个单一的大dll。我想知道,除了延迟加载的优点(并且我们现在忽略部署困难),是否有加载大量DLL的风险?谢谢! – 2009-12-03 20:03:43

+0

第一次访问时会加载一个dll。所以如果系统在启动时有一个初始化阶段,可以调用dll来强制它们加载。这将避免在“运行时间”的性能滞后。 20 dlls == dll地狱。如果可能,我会进行整合。 – Paul 2009-12-03 20:12:41

+0

他们只有*不同*性能特点。一个大型组件花费的总时间较少,但它会一次性发生,因此用户(或客户端系统,如果它们对时间敏感的话)更有可能感受到它。多组件方法需要更多的总时间来加载(如果全部加载它们),但是这个时间是分布式的 - 因此每个加载事件都不太可能产生显着的影响。 – 2009-12-03 20:18:28

回答

3

如果您的服务旨在一起使用,请将它们分组在同一个程序集中。我已经看到系统中有大量的dll被加载(并且有大量的解决方案在其中),而没有一个单独的实例需要樱桃挑选其中的一个。这并不妨碍你在命名空间中分离和理解分离。

就性能而言,dll的加载数量并没有真正的影响(如果你保持理智,不要去争取数以千计的),但是如果你坚持默认的行为VS喜欢复制每个项目的bin/debug目录中的每个引用。从中到大的解决方案(1000年级),构建过程将会更长,更令人沮丧。

将组件视为部署单元。如果东西是要一起部署的,请将你的东西装入同一个程序集中。

作为一个警告,如何挫败太多的程序集中的项目拆分,可以看看NUnit发行版。超过30个不同的dll,有些你必须参考才能进行单元测试,有些你不需要,你最终会寻找你需要的类型。

1

就个人而言,我想他们分成多个独立的DLL项目,以简化开发,测试,维护&。

+0

根据我的经验,单独的程序集并不总是简化这些东西 - 通常恰恰相反。 (特别考虑到部署。)你能详细说明一下吗? – 2009-12-03 20:14:56

1

当他们是单独的“服务”时,我强烈希望将它们分解为单独的项目和程序集。

如果您将所有内容放入单个程序集中,任何想要使用任何服务的客户端都会自动加载整个程序集。通过分解它们,您可以在不同的客户端应用程序之间降低内存使用率,并且只根据需要加载内容。从技术上讲,加载一个程序集比加载许多程序集要快,但如果你懒惰地从感知性能方面加载程序集,速度并不会更快。

加载程序集后,性能应该是相同的。

+0

我不得不笑。这是一个复杂的问题,许多利弊。 – Paul 2009-12-03 19:41:06

+0

这是一个非常复杂的问题。我只是从一个非常普遍的案例来谈论它。他特别提到通过多个名称空间支持多种类型的事实使我相信在“服务”中存在一些问题的分离,在这种情况下,单独的程序集通常是最好的方法。 – 2009-12-03 19:43:46

2

部署是一个大问题。如果所有这些功能都将被部署在一台机器上,我会建议一个.dll,用不同的名称空间进行行为分离。一个.dll将避免许多将来的问题与.dll兼容性,并大大简化部署和安装。

保罗

1

不要过早地优化。我会分离命名空间,直到您有要求将它们作为本地优化加入。

+0

嗨,大家好,感谢所有的输入;但不是你真的在寻找多个(超过20个)不同dll需要加载的效果,而不是一个单一的大dll。我想知道,除了延迟加载的优点(并且我们现在忽略部署困难),是否有加载大量DLL的风险? 谢谢! – 2009-12-03 20:03:13

2

我喜欢开发一个大系统作为几个独立的程序集/ DLL,以促进存在的体系结构。之后,如果有必要/可取的话,您可以在部署之前将功能重新打包成一个单独的程序集。

+0

我也喜欢这种方法。 使用多个装配意味着您倾向于考虑每个装配(及其类型)与其他装配(分层等)的关联方式。一旦您有一些满意的东西,就可以将装配整合到更少,更大的装配中。 – 2009-12-03 20:47:16

+0

是的最窄的API往往是组件间API。同样,如果这是一个大项目,你可能有不止一个开发团队,不同的团队在不同的程序集上工作(具有定义良好的组件间API):另请参阅Conway定律。 – ChrisW 2009-12-03 20:55:52

0

的DLL每次当我们称之为功能在其中时间加载。一个大的DLL不是一个好方法。使用更小的dll,这会增加你的性能。