我很难理解Ninject的NamedScope模块应该如何工作。在我看来,每个(定义的)范围应该用于上下文化“InNamedScope”的绑定。
以这个玩具为例:
void Main()
{
var kernel = new StandardKernel(new NamedScopeModule(), new ContextPreservationModule());
kernel.Bind<ParentC>().ToSelf().WithConstructorArgument("name", "Name1").DefinesNamedScope("scope1");
kernel.Bind<Intf>().ToConstant(new MyC() { ID = 1} ).InNamedScope("scope1");
kernel.Bind<ParentC>().ToSelf().WithConstructorArgument("name", "Name2").DefinesNamedScope("scope2");
kernel.Bind<Intf>().ToConstant(new MyC() { ID = 2 }).InNamedScope("scope2");
kernel.GetAll<ParentC>().Dump();
}
public class Intf
{
int ID { get; set; }
}
public class MyC : Intf
{
public int ID { get; set; }
}
public class ParentC
{
public ParentC(Intf[] c, string name)
{
this.C = c;
Name = name;
}
public string Name { get; set; }
public Intf[] C { get; set; }
}
对我来说,应该产生这样的东西:
但相反,我得到了一个例外:
UnknownScopeException:激活UserQuery + Intf时出错 范围scope2在当前上下文中是未知的。
我错过了什么?
答案 0 :(得分:1)
在Ninject中,范围与对象的生命周期有关。我更多地将命名范围视为将相同实例注入不同类的一种方式,如下所示:
public class Parent {
public Parent(Child child, GrandChild grandChild) {}
}
public class Child {
public Child(GrandChild grandchild) {}
}
public class GrandChild {}
kernel.Bind<Parent>().ToSelf().DefinesNamedScope("scope");
kernel.Bind<GrandChild>().ToSelf().InNamedScope("scope");
kernel.Get<Parent>();
注入grandChild
的{{1}}与注入Parent
的实例相同。