让我们假设我有三个接口:IFoo、IBar和IBaz。我还有类Foo、Bar和Baz,它们分别是这些接口的实现。
在这些实现中,每个类都依赖于接口IContainer。因此,对于Foo(以及类似地对于Bar和Baz),实现可能会如下所示:
在这种情况下,我希望实现类
我该如何在Ninject中实现这个功能?
注意:我不是在询问如何处理嵌套依赖项。我的问题是如何确保给定的依赖项在一个材料化服务的对象集合中是相同的。
非常明确地说,我知道Ninject在其标准形式下将生成等效于以下代码的代码:
在这些实现中,每个类都依赖于接口IContainer。因此,对于Foo(以及类似地对于Bar和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
,并约束注入到IFoo
、IBar
和IBaz
中的IDependency
对于所有三个接口都是相同的。手动实现可能会如下所示: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));