C#如何使用IoC容器注入嵌套依赖项?

时间:2017-07-17 19:06:25

标签: c# dependency-injection inversion-of-control ioc-container

是否可以仅使用IoC容器来解决此小程序中显示的依赖关系?怎么样?如何在容器中注册类,以便每个实例A形成自己的解析范围?

是否可以使用单个Resolve-call来重现程序?

class A
{

}

class B
{
    private readonly A a;

    public B(A a)
    {
        this.a = a;
    }
}

class C
{
    private readonly B b;

    public C(B b)
    {
        this.b = b;
    }

    public void PrintHello()
    {
        Console.WriteLine("Hello StackOverflow!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 10; ++i)
        {
            var a = new A();
            var b = new B(a);
            var c = new C(b);

            c.PrintHello();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

根据所使用的IoC容器,语法和初始化会有所不同,但无论如何它都是这样的:

初始化时:

var builder = new ContainerBuilder();
builder.RegisterType<A>().InstancePerDependency();
builder.RegisterType<B>().InstancePerDependency();
builder.RegisterType<C>().InstancePerDependency();

然后你的程序就是:

for (var i = 0; i < 10; ++i)
{
    var c = serviceProvider.getService<C>();
    c.PrintHello();
}

IoC容器将分别为C和B ctors提供B和A的新实例。

祝你好运!

答案 1 :(得分:0)

这是使用Ninject容器的示例。

    static void Main(string[] args)
    {
        using (var kernel = new StandardKernel())
        {
            kernel.Bind<A>().To<A>();
            kernel.Bind<B>().To<B>();
            kernel.Bind<C>().To<C>();

            for (var i = 0; i < 10; ++i)
            {
                var c = kernel.Get<C>();
                c.PrintHello();
            }
        }
    }

最流行的容器提供嵌套的依赖项解析功能。比较它们并选择你喜欢的。