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容器.注入容器

你不应该传递一个直接引用到你的类,因为这将使你的代码依赖于使用的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',并且会导致大量的混乱。我为处理这类事情的容器创建了静态工厂类。由容器解析的类实例应该只关心它们打算做什么,而不是进一步解析其他实例。