国际奥委会容器。注入容器

IoC Container. Inject container

我想要的:解析对象 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

服务定位器是一种反模式。那么,如果可以将服务定位器与 IoC 容器一起使用,那为什么可以呢?

虽然技术上可行,但有点 'containerception' 并且会导致大量混乱。我为处理此类事情的容器创建静态工厂 classes。您 class 由容器解析的实例应该只关心它们打算做什么,而不是进一步解析其他实例。

您不应传递对您的 class 的直接引用,因为这会使您的代码依赖于使用的 IOC 容器(此处为 UnityContainer),并使单元测试更加困难。

如果您的 class A 需要多个 C 实例,您应该为这种情况定义一个工厂并将该工厂的一个实例传递给您的 class A。您的真实工厂可以引用 UnityContainer。对于单元测试,您可以模拟接口并将模拟实例传递给您的 class 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();
        }
    }
}