【问题标题】:.NET Project Architecture.NET 项目架构
【发布时间】:2010-12-22 23:25:57
【问题描述】:

我有一个哲学问题,也需要考虑性能影响。

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

我的主要问题是:

  • 我们是否应该将它们分解为单独的 DLL,其中每个服务都有自己的 dll(如 product.services.serice1.dll、product.services.serice2.dll 等),或者我们应该将所有这些服务整合到一个单独的DLL,具有不同的名称空间,将它们分开。 就性能而言,这两者有什么区别吗?另外,社区(和微软)认可的最“可接受”的标准是什么?

谢谢

【问题讨论】:

  • 大家好,感谢您的所有意见;但是你们中没有人真正关注需要加载多个(超过 20 个)不同 dll 的效果,而不是单个大 dll。我想知道除了延迟加载的优势(我们暂时忽略部署困难)之外,是否存在加载大量 DLL 的风险?谢谢!
  • 第一次访问时会加载 dll。因此,如果系统在启动时经历了一个初始化阶段,您可以调用 dll 来强制它们加载。这将避免“运行时”的性能滞后。 20 个 dll == dll 地狱。如果可能的话,我会合并。
  • 它们只是具有不同的性能特征。加载一个大型程序集所需的总时间更少,但它同时发生,因此用户(或客户端系统,如果他们对时间敏感)更有可能感受到它。多组件方法需要更多的总时间来加载(如果您全部加载),但时间是分布的 - 因此每个加载事件不太可能产生重大影响。

标签: .net design-patterns architecture oop


【解决方案1】:

如果您的服务要一起使用,请将它们分组到同一个程序集中。我已经看到加载了无数 dll 的系统(以及其中包含无数项目的解决方案),没有一个实例需要在其中挑选一个程序集而不是任何其他程序集。这并不妨碍您在命名空间中进行解耦和合理的分离。

就性能而言,加载的 dll 的数量并没有真正的影响(如果您保持理智并且不要使用数千个),但是如果您坚持使用 VS 的默认行为,则对开发的影响是巨大的谁喜欢复制每个项目的 bin/debug 目录中的每个引用。在大中型解决方案(1000 个类)中,构建过程会更长,更令人沮丧。

将程序集视为一个部署单元。如果要一起部署东西,请将您的东西放在同一个程序集中。

作为一个警告,将项目拆分成太多的程序集是多么令人沮丧,请查看 NUnit 发行版。超过 30 种不同的 dll,有些你必须参考才能进行单元测试,有些你没有,你最终会寻找你需要的类型。

【讨论】:

    【解决方案2】:

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

    保罗

    【讨论】:

      【解决方案3】:

      我喜欢将大型系统开发为几个独立的程序集/DLL,以促进架构的存在。之后,如果需要/需要,您可以在部署之前将功能重新打包到单个程序集中。

      【讨论】:

      • 我也喜欢这种方法。使用多个程序集意味着您倾向于考虑每个程序集(及其类型)与其他程序集的关联方式(分层等)。一旦您对某些东西感到满意,您就可以将这些程序集合并为更少、更大的程序集。跨度>
      • 是的,最窄的 API 往往是程序集间 API。此外,如果项目那么大,您可能拥有多个开发团队,不同的团队处理不同的程序集(使用明确定义的程序集间 API):另请参阅康威定律。
      【解决方案4】:

      就我个人而言,我会将它们分成独立的 DLL 项目以简化开发、测试和维护。

      【讨论】:

      • 根据我的经验,单独的程序集并不总是能简化这些事情——通常恰恰相反。 (特别考虑部署。)你能详细说明一下吗?
      【解决方案5】:

      当它们是单独的“服务”时,我非常喜欢将它们分解为单独的项目和程序集。

      如果你把所有东西都放在一个程序集中,任何想要使用任何服务的客户端都会自动加载整个程序集。通过分解它们,您可以降低不同客户端应用程序之间的内存使用量,并且只根据需要加载内容。从技术上讲,加载一个程序集比加载多个程序集要快,但如果您延迟加载程序集就感知性能而言,它并不会更快。

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

      【讨论】:

      • 我不得不笑。这是一个复杂的问题,有很多利弊。
      • 这是一个非常复杂的问题。我只是从一个非常普遍的案例中谈论它。他特别提到通过多个命名空间支持多种类型的事实让我相信“服务”中存在一些关注点分离,在这种情况下,单独的程序集通常是最好的方法。
      【解决方案6】:

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

      【讨论】:

      • 大家好,感谢您的所有意见;但是你们中没有人真正关注需要加载多个(超过 20 个)不同 dll 的效果,而不是单个大 dll。我想知道除了延迟加载的优势(我们暂时忽略部署困难)之外,是否存在加载大量 DLL 的风险?谢谢!
      【解决方案7】:

      .NET 程序集代表一个物理工件,用于打包您不应该用于架构事物的东西。换句话说,使用尽可能少的程序集,最好只使用一个 .NET 程序集。我建议阅读these 2 white books,了解如何在程序集、命名空间、层和组件中划分代码。

      【讨论】:

        【解决方案8】:

        每当我们调用其中的函数时,dll 都会加载。一个大的dll不是一个好方法。使用较小的 dll,这将提高您的性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 2017-09-09
          • 2019-06-21
          • 2015-10-23
          相关资源
          最近更新 更多