2014-09-16 3 views
0

나는 인터페이스가 있습니다객체의 속성에 기반한 객체 바인딩? 협약 또는 문맥에 구속력이 있습니까?

public interface IInterface 
{ 
string Get(obj o); 
} 

을하고 나는이 개 수업이 있습니다

public class C1 : IInterface 
{ 
string Get(obj o); 
} 

public class C2 : IInterface 
{ 
string Get(obj o); 
} 

나는 O를 보내려고하고 Ninject에 그것이의 재산을 기반으로하는 인터페이스 결정이 줄을 영형.

Bind<IInterface>().To<C1>.When(obj.Name == "C1"); 
Bind<IInterface>().To<C2>.When(obj.Name == "C2"); 

하지만 내가 전에 Ninject에 함께 일하지 않은 : 내가 좋아하는 뭔가를하고 싶습니다

public class obj 
{ 
    public string Name {get;set;} 
    public int Id {get;set;} 
} 

: 같은 OBJ있는 뭔가. 어떤 아이디어?

+0

나는 당신이 당신의 모범을 엉망으로 만들었다 고 생각합니다. 어떻게하면'IInterface'의 인스턴스에 접근해야한다면'IInterface'를 어떻게 구현할 수 있습니까? 너는 할 수 없었다. 'Name' 속성을 가진'obj'를 팩토리에 전달한 다음'IInterface'를 리턴하는 것을 의미합니까? – BatteryBackupUnit

+0

Q/A가 나중에 독자에게 도움이 될 수 있도록 질문을 "수정"할 수 있습니까? 감사. – BatteryBackupUnit

답변

1

"생각 단계"와 필요한 정보를 건너 뛰었 기 때문에 질문에 대한 해석이 다소 진보적이었습니다.

그러나, 나는 추천 무엇과 같이 그 일을한다 :

public interface INamed 
{ 
    string Name { get; } 
} 

public interface IFactory 
{ 
    IInterface Create(INamed obj); 
} 

public class Factory : IFactory 
{ 
    private readonly IResolutionRoot resolutionRoot; 

    public Factory(IResolutionRoot resolutionRoot) 
    { 
     this.resolutionRoot = resolutionRoot; 
    } 

    public IInterface Create(INamed obj) 
    { 
     return this.resolutionRoot.Get<IInterface>(obj.Name); 
    } 
} 

가 대체 : 당신은 또한 ninject factory extension를 사용할 수 있습니다. 슬프게도 기본적으로 명명 된 바인딩을 지원하지 않지만 문서화 된대로 here처럼 사용자 정의 할 수 있습니다.

그러나 나는 공장을 수동으로 구현하기를 원합니다. 왜냐하면 그것은 더 쉽게 이해할 수 있기 때문입니다. 만약 내가 공장을 커스터마이징한다면, 나는 각각의 .ToFactory() 바인딩을 어떻게 매개 변수를 해석 할지를 설정하는 대신에 (factory 메소드 매개 변수를 다루는 방법을 지정하는) 속성에 대한 지원을 추가하는 것을 고려할 것이다.

+0

감사합니다. 내 친구도 공장 패턴을 제안했습니다. IResolutionRoot 부분을 명확히 할 수 있습니까? – user3328656

+0

ninject의 커널은'IBindingRoot'와'IResolutionRoot'에서 파생되는'IKernel' 인터페이스를 구현하고 있습니다. 'IBindingRoot'는 바인딩 (Bind(). To() ...)을 생성하는데 사용되며,'IResolutionRoot'는 타입의 검색/인스턴스화에 사용됩니다. 당신은'Bind '를 할 필요가 없으며 이미 ninject에 의해 묶여있다. 예를 들어 ninject 팩토리 확장은 내부적으로'IResolutionRoot'를 사용하여 유형을 인스턴스화합니다. – BatteryBackupUnit

관련 문제