DI和Singleton Pattern在一个实现中
我想使用Windsor IOC / DI框架重构一些代码,但我的问题是我有一些Singleton类和Factory模式类,我不确定是否可以使用DI实现Singleton或Factory。
有没有人有任何想法,如果有可能,怎么样?
Singleton设计模式与DI不一致。 虽然可以打开单身人士以至于DI和开放/封闭原则开始变得有意义,但这会使Singleton变得如此之多以至于它几乎不再是一个单身人士。
线程安全是您开始打开Singleton时想到的一个大问题。
简单地定义您的服务和类而不考虑它们的范围太多会好得多。 如果您有一个想要在多个消费者之间共享的对象,大多数DI容器都具有Singleton 生命周期的概念,它模仿Singleton设计模式的好处而不会遇到任何缺点。
简而言之:单身人士是邪恶的,应该避免。
另一方面, 抽象工厂对于DI目的非常有用。
你没有,你让IOC容器做到了。 在您明确调用工厂获取对象的单例实例之前,现在您可以让IOC容器为您创建对象图,并将所有内容挂钩到它所属的位置。 容器确保你的单身人士是单身人士,并充当工厂。
如果您正在讨论让工厂在运行时决定要提供什么样的对象,那么DI不适用于那里,除非您可以让DI容器将工厂注入您想要的工厂并为您管理其范围。
大多数现代dependency injection框架允许您指定它们是应该在应用程序(或请求)的生命周期内提供单个对象实例,还是在每次请求时创建新实例。
您也可以使用DI框架在适当的时候解决工厂的依赖关系(如果这就是您的意思)。 如果工厂根据运行时数据选择子类,或者依赖对象需要创建许多IFoo
实例,则可以执行此操作,在这种情况下,您可能会注入IFooFactory
。