代码之家  ›  专栏  ›  技术社区  ›  StriplingWarrior

我正在使用依赖注入:我应该将哪些类型绑定为单例?

  •  9
  • StriplingWarrior  · 技术社区  · 16 年前

    自从几个月前我真正“发现”依赖注入以来,我一直在推动它在我们的团队中的采用,随着时间的推移从代码中移除静态和单例模式,并尽可能使用基于构造函数的注入。我们采用了约定,这样就不必一直向DI模块添加显式绑定。我们甚至使用DI框架来提供logger实例,这样我们就可以自动告诉每个logger它在哪个类中,而不需要额外的代码。现在我有了一个地方可以控制各种类型的绑定方式,很容易确定特定类别的类(实用程序类、存储库等)的生命周期应该是什么。

    我最初的想法是,如果我希望经常使用类,那么将类绑定为单例可能会有一些好处。这只是意味着 new 正在继续,特别是当您正在创建的对象最终有一个大的依赖关系树时。在这些类中,几乎所有的非静态字段都是那些被注入到构造函数中的值,因此当实例不被使用时,保持它的内存开销相对较小。

    然后我在电视上读到“单身我爱你,但你让我失望”www.codingwithoutcomments.com,这让我怀疑自己的想法是否正确。毕竟,Ninject在默认情况下编译对象创建函数,因此在创建这些对象的其他实例时很少涉及反射开销。因为我们将业务逻辑排除在构造函数之外,所以创建新实例是一个非常轻量级的操作。而且对象没有一堆非静态字段,因此在创建新实例时也没有太多内存开销。

    所以在这一点上,我开始认为这两种方式都不会有多大关系。有没有其他我没有考虑的因素?是否有人通过改变某些类型对象的生命周期而真正体验到性能的显著改善?遵循DI模式是唯一真正重要的事情吗,还是有其他原因说明使用一个对象的单个实例本身就是“坏的”

    4 回复  |  直到 16 年前
        1
  •  5
  •   Zebi    16 年前

    如果在不确定的情况下,我宁愿每次使用对象时都重新创建它,并且仅当您确实需要时才将其标记为singleton或“per thread”/“per request”/“per whatever”。

    即使对象目前没有状态并且似乎保存为共享,也可以稍后重构并向其添加状态,这些状态可能会在不同的对象/实例之间无意中共享。

        2
  •  1
  •   Wix    16 年前

    我不确定内存管理是否是一个大问题,除非您正在创建很多对象。我发现使用IoC容器中的singleton在处理缓存之类的事情时很有用,创建缓存对象并连接到缓存服务器在创建过程中很昂贵,所以我们只创建一次缓存对象并重用它。

        3
  •  0
  •   gtrak    16 年前

        4
  •  0
  •   Community Mohan Dere    9 年前

    如中所述 Gary's answer ,DI的全部要点是可测试性(您可以轻松模拟对类的所有引用,因为它们都列在构造函数中),而不是运行时性能。

    你呢 希望 做TDD(试驾开发),对吗?

    推荐文章