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