【问题标题】:C# How to inject nested dependencies with IoC container?C# 如何使用 IoC 容器注入嵌套依赖项?
【发布时间】:2017-07-18 14:32:13
【问题描述】:

是否可以仅使用 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();
        }
    }
}

【问题讨论】:

  • 如果您要求特定代码来注册您的服务,您需要告诉我们您使用的是哪个服务容器,语法不同。
  • 是的,可以使用 IoC 容器。您更喜欢使用哪个容器?
  • 就您的问题而言,大多数服务容器都支持这一点,只需注册所有服务,容器将负责其余的工作。通常你也不需要做任何具体的事情,只需确保所有服务都已注册。
  • 如果问题是“我应该使用哪个框架”,那么这个问题与 Stackoverflow 无关。

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


【解决方案1】:

根据使用的 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 ctor 提供 B 和 A 的新实例。

祝你好运!

【讨论】:

  • 我认为@Ckratide 是对的,但是关于控制容器反转的问题相当广泛,因为不同的容器有不同的注册依赖关系和解决它们的方式,但一个事实仍然存在,你之前已经绑定过解决任何情况。对于嵌套依赖项,您必须使用像 Unity 这样的高级 IoC 容器。一旦您按照上述情况注册了 A 和 B,然后尝试使用容器获取 C 的实例。它会自动解析 C 内部的依赖关系。
  • @devTimmy - 真的有不能处理嵌套的流行容器吗?例如,我对温莎城堡没有任何问题。或者 Spring,在 Javaland。
  • 我使用的语法是从 .Net Core 控制台程序中提取的,使用 AutoFac 作为 IoC 容器。
  • 哦,是的,Unity 在 .net 中非常流行,最近 ASP.NET 核心发布了它的 IoC 容器版本,该版本与 asp.net 核心一起提供。
  • 我们如何在默认的 .net6.0 内置依赖注入中做到这一点。
【解决方案2】:

这是使用 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();
            }
        }
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多