正确使用Ninject NamedScope

时间:2017-10-09 12:53:31

标签: c# ninject named-scope ninject-extensions

我很难理解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; }
}

对我来说,应该产生这样的东西:

enter image description here

但相反,我得到了一个例外:

  

UnknownScopeException:激活UserQuery + Intf时出错   范围scope2在当前上下文中是未知的。

我错过了什么?

1 个答案:

答案 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的实例相同。