2017-10-09 13 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

을하지만 그 대신, 내가 예외에 얻을 :

UnknownScopeException을이 장난감 예와

: UserQuery + Intf 활성화 오류 scope2는 유효하지 않습니다. 현재 상황에서 알려져있다.

무엇이 누락 되었습니까?

답변

1

Ninject에서 범위는 개체의 수명과 관련이 있습니다. I보다 같이, 다른 클래스에 동일한 인스턴스를 주입하는 방법으로 범위라는 참조 :

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

grandChildChild에 주입 동일한 인스턴스 Parent 내로 주입이다.

+0

그것은 의미가 있습니다, 나는 ninject 범위의 목적을 오해 한 것 같아요. 내가 성취하려는 일을하는 확장이 있습니까? 아니면'Named (..)'과'WhenAnyAncestorNamed (..)'를 사용해야합니까? –

+0

예,'Named (...)'와'WhenAnyAncestorNamed (...)'가 아마 작동 할 것입니다. 당신의 장난감 예제는 또 다른 SO 질문을 생각 나게합니다. https://stackoverflow.com/questions/43864334/ninject-binding-a-tree-of-data 그리고 Ninject를 사용하여 데이터 중심이 아닌 구성 요소의 그래프를 바인딩하는 것이 좋습니다 사물. –

+0

동의합니다.이 예제를 단순화하기위한 것이 었습니다. 실제 문제는 NamedScope를 사용하여 다른 클래스에 다른 바인딩을 사용하려고 시도하는 것이 었습니다. 도와 줘서 고맙다. –