DI和Singleton Pattern在一个实现中

时间:2009-12-16 19:48:21

标签: c# inversion-of-control

我想使用Windsor IOC / DI框架重构一些代码,但我的问题是我有一些Singleton类和Factory模式类,我不确定是否可以使用DI实现Singleton或Factory。

有没有人有任何想法,如果有可能以及如何?

3 个答案:

答案 0 :(得分:6)

Singleton设计模式与DI不一致。虽然可以打开单身人士以至于DI和Open/Closed Principle开始变得有意义,但这会使单身人士变得如此之多以至于它几乎不再是单身人士。

线程安全是您开始打开Singleton时想到的一个大问题。

简单地定义您的服务和类而不考虑它们的范围太多会好得多。如果您有一个想要在多个消费者之间共享的对象,那么大多数DI容器都具有Singleton 生命周期的概念,它模仿Singleton设计模式的好处而不会遇到任何缺点。

简而言之:单身人士是邪恶的,应该避免。

另一方面,

Abstract Factory 非常可用于DI目的。

答案 1 :(得分:2)

你没有,你让IOC容器做到了。在您明确调用工厂获取对象的单例实例之前,现在您可以让IOC容器为您创建对象图,并将所有内容挂钩到它所属的位置。容器确保你的单身人士是单身人士,并且作为工厂。

如果您正在谈论让工厂在运行时决定要提供什么样的对象,那么DI不适用于此,除非您可以让DI容器将工厂注入您想要的工厂并为您管理其范围。

答案 2 :(得分:0)

大多数现代依赖注入框架允许您指定它们是否应该在应用程序(或请求)的生命周期内提供单个对象实例,或者在每次请求时都创建新实例。

您也可以使用DI框架在适当的时候解决工厂的依赖关系(如果这就是您的意思)。如果工厂根据运行时数据选择子类,或者依赖对象需要创建许多IFoo实例,则可以执行此操作,在这种情况下,您可能会注入IFooFactory