IoC容器。注入容器

时间:2016-11-11 12:55:24

标签: c# inversion-of-control unity-container ioc-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 Container一起使用,为什么还可以呢?

2 个答案:

答案 0 :(得分:3)

您不应该直接引用您的类,因为这将使您的代码依赖于使用的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();
        }
    }
}

答案 1 :(得分:0)

虽然从技术上讲它是有效的,但它有点像容器#39;并会导致巨大的混乱。我为处理这种事情的容器创建了静态工厂类。容器解析的类实例应该只关注它们应该做什么,而不是进一步解析其他实例。