首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何使用IoC容器注入嵌套依赖项?

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

Stack Overflow用户
提问于 2017-07-17 19:06:25
回答 2查看 2.3K关注 0票数 1

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

是否可以使用单一的解析调用来复制程序?

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-17 19:15:37

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

初始化时:

代码语言:javascript
复制
var builder = new ContainerBuilder();
builder.RegisterType<A>().InstancePerDependency();
builder.RegisterType<B>().InstancePerDependency();
builder.RegisterType<C>().InstancePerDependency();

那么您的程序将简单地是:

代码语言:javascript
复制
for (var i = 0; i < 10; ++i)
{
    var c = serviceProvider.getService<C>();
    c.PrintHello();
}

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

祝好运!

票数 1
EN

Stack Overflow用户

发布于 2017-07-17 19:52:37

这是使用Ninject容器的示例。

代码语言:javascript
复制
    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();
            }
        }
    }

最流行的容器提供嵌套依赖解决功能。比较它们,然后选择你最喜欢的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45151839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档