C# DI和单例模式在一个实现中

C# DI和单例模式在一个实现中,c#,inversion-of-control,C#,Inversion Of Control,我想使用Windsor IOC/DI框架重构一些代码,但我的问题是我有一些单例类和工厂模式类,我不确定是否可以使用DI实现单例或工厂 有人知道这是否可能,以及如何做到吗?如果没有,就让IOC容器来做。在您显式调用工厂以获取对象的单例实例之前,现在您可以使用IOC容器为您创建对象图,并将所有内容连接到它所属的位置。容器确保您的单例是单例,并充当工厂 如果你说的是让工厂在运行时决定提供什么类型的对象,DI不适用于那里,除非你可以让DI容器将工厂注入到你想要的地方,并为你管理它的范围。单例设计模式与D

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


有人知道这是否可能,以及如何做到吗?

如果没有,就让IOC容器来做。在您显式调用工厂以获取对象的单例实例之前,现在您可以使用IOC容器为您创建对象图,并将所有内容连接到它所属的位置。容器确保您的单例是单例,并充当工厂


如果你说的是让工厂在运行时决定提供什么类型的对象,DI不适用于那里,除非你可以让DI容器将工厂注入到你想要的地方,并为你管理它的范围。

单例设计模式与DI不一致。虽然有可能打开一个单例,使DI和开始有意义,但这将改变单例,使其几乎不再是单例

线程安全是一个大问题,当你开始打开一个单件

只定义服务和类而不考虑它们的范围要好得多。如果您想在多个使用者之间共享一个对象,那么大多数DI容器都有单例生存期的概念,它模仿了单例设计模式的优点,而没有任何缺点

简言之:单身是邪恶的,应该避免


另一方面,它对于DI非常有用。

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


在适当的时候,您还可以使用DI框架来解决对工厂的依赖关系(如果您的意思是这样的话)。如果工厂基于运行时数据选择子类,或者如果依赖对象需要创建许多
IFoo
实例,那么您可以这样做,在这种情况下,您可以注入
IFooFactory

单例,这是我经常使用的,但是读到这篇文章,似乎我必须改变我的策略!我发现它们在某些情况下非常有用。。。但是我可以看出线程安全的来龙去脉。线程安全是一回事,但主要问题是违反了打开/关闭原则。如果我使用DI容器来管理单例的范围,为什么这违反了OCP?因为我不依赖静态方法来实现,所以我仍然可以对它进行子类化,我认为为单例使用DI容器可以让我保留OCP?如果您的DI容器实现了一个接口,而它恰好是一个单例,那么它并不违反OCP——它只是一个实现细节。危险在于,由于它是一个单例,因此它在任何地方都可用,因此没有经验的开发人员可能直接使用它,从而在不经意间造成紧密耦合。单例的常见用法(而不是将其用于Flyweight等)和DI都解决了相同的问题—所需依赖项的位置。试图将它们结合起来是没有意义的,因为你最终会两次解决同一个问题。只要使用DI——从长远来看,它会给你更多的灵活性。我的意思是后者使用工厂创建某个类的多个实例,然后必须将工厂注入到某个类中。IOC框架也不能决定在运行时为哪个对象提供服务吗?那么,在使用DI时,为什么要以这种方式使用工厂呢?我会更多地使用工厂来创建相同或类似类的多个实例……我的意思是,当使用IOC而不是“使用DI”时,通常IOC框架是非常静态的,它们根据配置(xml、注释、属性文件等)为您创建对象,所以不,没有太多的能力来决定动态创建什么。