【发布时间】:2009-12-16 19:48:20
【问题描述】:
我想使用 Windsor IOC/DI 框架重构一些代码,但我的问题是我有一些单例类和工厂模式类,我不确定是否可以使用 DI 实现单例或工厂。
有没有人有任何想法,如果可能的话,怎么做?
【问题讨论】:
我想使用 Windsor IOC/DI 框架重构一些代码,但我的问题是我有一些单例类和工厂模式类,我不确定是否可以使用 DI 实现单例或工厂。
有没有人有任何想法,如果可能的话,怎么做?
【问题讨论】:
Singleton 设计模式与 DI 不一致。虽然可以打开一个 Singleton 以至于 DI 和 Open/Closed Principle 开始变得有意义,但这将改变 Singleton 以至于它几乎不再是一个 Singleton。
线程安全是您开始打开 Singleton 时想到的一个大问题。
最好简单地定义您的服务和类而不考虑它们的范围。如果您想在多个使用者之间共享一个对象,大多数 DI 容器都有 Singleton lifetime 的概念,它模仿了 Singleton 设计模式的优点而没有任何缺点。
简而言之:单身人士是邪恶的,应该避免。
另一方面,Abstract Factory 对于 DI 目的非常很有用。
【讨论】:
你没有,你让 IOC 容器来做。在显式调用工厂以获取对象的单例实例之前,现在您让 IOC 容器为您创建对象图,并将所有内容连接到它所属的位置。容器确保您的单例是单例,它充当工厂。
如果您说的是让工厂在运行时决定提供哪种对象,则 DI 不适用于那里,除非您可以让 DI 容器将工厂注入您想要的位置并为您管理其范围。
【讨论】:
大多数现代依赖注入框架允许您指定它们是否应该在应用程序(或请求)的生命周期内提供单个对象实例,或者在您每次请求时创建新实例。
您还可以在适当的时候使用 DI 框架来解决对工厂的依赖关系(如果这就是您的意思)。如果工厂根据运行时数据选择子类,或者依赖对象需要创建许多 IFoo 实例,您可能会这样做,在这种情况下,您可能会注入 IFooFactory。
【讨论】: