IoC容器.注入容器
本文关键字:注入 容器 IoC | 更新日期: 2023-09-27 18:17:22
我想要:解析对象A,在对象A中,我想使用相同的容器来解析对象C:
public static void Work()
{
IUnityContainer con = new UnityContainer();
con.RegisterType<IA, A>();
con.RegisterType<IB, B>();
con.RegisterType<IC, C>();
var a = con.Resolve<IA>();
}
interface IA { }
interface IB { }
interface IC { }
class A : IA
{
public A(IB b, IUnityContainer con)
{
for (int i = 0; i < 10; i++)
{
var c = con.Resolve<IC>();
}
}
}
class B : IB { };
class C : IC { };
问题:在许多网站上,我看到注入容器是坏主意,但如何在这种情况下?
编辑1
Service Locator是一个反模式。那么,如果可以将服务定位器与IoC容器一起使用,为什么可以呢?
你不应该传递一个直接引用到你的类,因为这将使你的代码依赖于使用的IOC容器(这里是UnityContainer),并使它更难进行单元测试。
如果你的类A需要C的多个实例,你应该为这种情况定义一个工厂,并将该工厂的一个实例传递给你的类A。你真正的工厂可以引用UnityContainer。对于单元测试,您可以模拟接口并将模拟实例传递给类a。
代码应该是这样的:
public interface IClassICFactory
{
IC CreateInstance();
}
public class ClassICUnityContainerFactory : IClassCFactory
{
private IUnityContainer _container;
public ClassICUnityContainerFactory(IUnityContainer container)
{
_container = container;
}
public IC CreateInstance()
{
return _container.Resolve<C>();
}
}
class A : IA
{
public A(IB b, IClassICFactory factory)
{
for (int i = 0; i < 10; i++)
{
var c = factory.CreateInstance();
}
}
}
虽然从技术上讲它是有效的,但它有点'containerception',并且会导致大量的混乱。我为处理这类事情的容器创建了静态工厂类。由容器解析的类实例应该只关心它们打算做什么,而不是进一步解析其他实例。