C# 如何使用 IoC 容器注入嵌套依赖项?
C# How to inject nested dependencies with 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 Whosebug!");
}
}
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 容器,语法和初始化会有所不同,但无论如何它会是这样的:
初始化时:
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 构造器提供 B 和 A 的新实例。
祝你好运!
这是使用 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();
}
}
}
最流行的容器提供嵌套依赖解析能力。比较它们并选择您最喜欢的。
是否可以仅使用 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 Whosebug!");
}
}
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 容器,语法和初始化会有所不同,但无论如何它会是这样的:
初始化时:
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 构造器提供 B 和 A 的新实例。
祝你好运!
这是使用 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();
}
}
}
最流行的容器提供嵌套依赖解析能力。比较它们并选择您最喜欢的。