2017-10-09 10 views
1

NinjectのNamedScopeモジュールがどのように動作するべきかを理解するのに苦労しています。私の考えでは、各(定義された)スコープは、 "InNamedScope"であるバインディングをコンテキスト化するために使用されるべきです。このおもちゃの例ではNinject NamedScopeの適切な使用

:私のために

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

をしかし、その代わりに、私はexeceptionを得る:

UnknownScopeException:スコープスコープ2は、UserQuery + Intfの起動中にエラーが発生しました。 現在の状況で知られている。

私は何が欠けていますか?

答えて

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>(); 

Parentに注入grandChildChildに注入されるのと同じインスタンスです:私はこのような異なるクラスの中に同じインスタンスを注入する方法として、より多くの範囲を命名参照してください。

+0

それは意味があります、私はninjectの範囲の目的を誤解したと思います。私が達成しようとしている拡張機能はありますか?あるいは、 'Named(..)'と 'WhenAnyAncestorNamed(..)'を使用する必要があります。 –

+0

はい、 'Named(...)'と 'WhenAnyAncestorNamed(...)'がおそらく動作します。あなたのおもちゃの例は、別のSOの質問、https://stackoverflow.com/questions/43864334/ninject-binding-a-tree-of-dataを思い出させ、データ中心ではなくコンポーネントのグラフをバインドするためにNinjectを使用することをお勧めしますオブジェクト。 –

+0

これは例を簡略化することに過ぎませんでした。実際の問題はNamedScopeを使って異なるクラスに異なるバインディングを使用しようとしていたことでした。助けてくれてありがとう。 –