让我们有三个接口:IFoo
, IBar
, IBaz
. 我也有类Foo
, Bar
, ,Baz
它们是各自的实现。
在实现中,每个都依赖于接口IContainer
。因此,对于Foo
(以及类似地对于Bar
and Baz
),实现可能是:
class Foo : IFoo
{
private readonly IDependency Dependency;
public Foo(IDependency dependency)
{
Dependency = dependency;
}
public void Execute()
{
Console.WriteLine("I'm using {0}", Dependency.Name);
}
}
假设我有一个Container
恰好包含IFoo
,IBar
和实例的类IBaz
:
class Container : IContainer
{
private readonly IFoo _Foo;
private readonly IBar _Bar;
private readonly IBaz _Baz;
public Container(IFoo foo, IBar bar, IBaz baz)
{
_Foo = foo;
_Bar = bar;
_Baz = baz;
}
}
在这种情况下,我希望实现类与注入到,中的约束Container
绑定,并且对所有三个都相同。以手动方式,我可以将其实现为:IContainer
IDependency
IFoo
IBar
IBaz
IDependency dependency = new Dependency();
IFoo foo = new Foo(dependency);
IBar bar = new Bar(dependency);
IBaz baz = new Baz(dependency);
IContainer container = new Container(foo, bar, baz);
我怎样才能在 Ninject 中实现这一点?
注意:我不是在问如何做嵌套依赖。我的问题是如何保证物化服务中的对象集合中给定的依赖关系是相同的。
非常明确地说,我知道 Ninject 的标准形式将生成等效于以下内容的代码:
IContainer container = new Container(new Foo(new Dependency()), new Bar(new Dependency()), new Baz(new Dependency()));
我不喜欢这种行为。我也不能将其Dependency
创建为单例。具体来说,这意味着如果我有多个请求GetService<IContainer>
,则 Ninject 调用在语义上应该等同于以下手动注入:
var dep1 = new Dependency();
var container1 = new IContainer(new Foo(dep1), new Bar(dep1), new Baz(dep1));
var dep2 = new Dependency();
var container2 = new IContainer(new Foo(dep2), new Bar(dep2), new Baz(dep2));