Str*_*ior 9 singleton dependency-injection
关于单身人士是否"不好"以及使用什么样的模式,存在很多问题.它们通常专注于单例设计模式,它涉及从类上的静态方法中检索单例实例.这不是其中一个问题.
自从几个月前我真正"发现"依赖注入以来,我一直在推动它在我们团队中的应用,随着时间的推移从我们的代码中删除静态和单例模式,并尽可能使用基于构造函数的注入.我们采用了约定,因此我们不必继续向DI模块添加显式绑定.我们甚至使用DI框架来提供记录器实例,这样我们就可以自动告诉每个记录器它没有附加代码.现在我有一个地方可以控制各种类型的绑定方式,很容易确定特定类别(实用程序类,存储库等)的生命周期.
我最初的想法是,如果我希望它们经常被使用,那么将类绑定为单例可能会有一些优势.它只是意味着new
正在进行的事情要少得多,特别是当你正在创建的对象最终有一个很大的依赖树时.几乎所有这些类中的非静态字段都是注入构造函数的值,因此在不使用实例时保持实例的内存开销相对较小.
然后我在www.codingwithoutcomments.com上读到"Singleton我爱你,但是你让我失望",这让我想知道我是否有正确的想法.毕竟,Ninject默认编译对象创建函数,因此创建这些对象的其他实例时所涉及的反射开销非常小.因为我们将业务逻辑保留在构造函数之外,所以创建新实例是一个非常轻量级的操作.并且对象没有一堆非静态字段,因此创建新实例也不会产生大量内存开销.
所以在这一点上,我开始认为它可能无论多么重要.还有其他考虑因素我没有考虑过吗?是否有人通过改变某些类型物体的生命周期实际上经历了性能的显着改善?遵循DI模式是唯一真正重要的事情,还是有其他原因使用对象的单个实例本质上是"坏"?
我正在使用单例实例来缓存昂贵的创建对象(如nhibernate会话工厂)或我希望在整个应用程序中共享的对象.
如果在不确定的情况下,我宁愿每次使用时重新创建对象,并将其标记为单个或"每个线程"/"每个请求"/"每个任何"只有在您真正需要的时候.
在所有地方散布单例以潜在地保存一些新功能是过早优化并且可能导致非常讨厌的错误,因为您无法确定对象是新的还是跨多个对象/实例共享.
即使对象目前没有状态并且似乎保存为共享,有人可以稍后重构并向其添加状态,然后可能无意中在不同对象/实例之间共享.
归档时间: |
|
查看次数: |
377 次 |
最近记录: |