2013-07-31 1 views
0
내 일반 바인딩이

, 그리고 하나는 이것이다 :Ninject WithConstructorArgument가 형식에 대한 전역 바인딩을 재정의하지 않습니까?

Bind<IHasher>().To<SHA256Hasher>(); 

이이 심부름 군을 사용하는 내내 몇 가지 클래스가 있기 때문에, 잘 작동합니다. 그러나 md5 해시를 예상하는 gravatar와 같은 제 3 자와의 해시를 사용하는 또 다른 유형의 해더가 필요한 컨트롤러가 하나 또는 두 개 있습니다. 그럼 저는 다음을 수행하십시오

Bind<ISomeController>().To<SomeController>().Named("SomeController").WithConstructorArgument("emailHasher", new Md5Hasher()); 

그럼 내 컨트롤러는 다음과 같습니다

public class SomeController : Controller 
    { 
     private IHasher emailHasher; 

     public CampaignController(IHasher emailHasher) 
     { 
      this.emailHasher = emailHasher; 
     } 
    } 

것은 내가 IHasher이 Md5Hasher 것으로 기대 디버깅 할 때, 그러나 그것이 Sha256Hasher입니다. 그렇다면이 예상되는 동작과 오버라이드 된 형식을 사용하는 방법은 무엇입니까?

+0

일반적으로 컨트롤은 인터페이스에 의해서가 아니라 유형에 따라 결정됩니다. 또한 이름을 등록 할 필요가 없으므로 등록 할 때 'Bind (). ToSelf(). WithConstructorArgument ("emailHasher ", 새로운 Md5Hasher()); – nemesv

+0

플러그인 스타일 아키텍처를 사용하고 컨트롤러가 이름으로 액세스되기 때문에이 질문의 범위를 벗어나는 이유가 있습니다. 그러나 나는 단지 그것을 넣었 으면합니다. 이 영역 주위에 주입 과정에 영향을 줄 수있는 것. 그래서 구체적인 유형과 명명 기준을 가진 인터페이스가있는 이유가 있습니다. – Grofit

+1

'WithConstructorArgument'는 예상대로 작동해야합니다. 문제의 원인이되는 커스텀 플러그인 아키텍처에 뭔가가 있습니다. 컨트롤러 등록이 올바른 순서로 호출되지 않고 나중에'WithConstructorArgument' 등록이 일부 기본값으로 다시 정의됩니다. .. – nemesv

답변

1

나는 이것이 MVC 컨트롤러라고 생각한다. MVC 프레임 워크는 SomeController이 아닌 ISomeController을 해결합니다. 따라서 바인딩은 적용되지 않지만 Ninject는 암시 적 바인딩 SomeControllerToSelf을 대신 사용합니다.

대신 SomeControllerToSelf에 대한 바인딩을 만듭니다.

+0

실제 사용 사례는 사용자 정의 컨트롤러 팩터 리 및 사물과 조금 더 복잡하므로 인터페이스가 아닌 인터페이스와 명명 된 바인딩을 사용합니다. 모든 유형의 런타임 플러그인이 런타임 플러그인을 후킹하도록 허용하기 때문에 형식이 아닙니다. 어쨌든 당신에게 답을주었습니다. 이것은 어떤 정상적인 유스 케이스에서도 문제를 해결할 수있는 방법 일 것입니다. – Grofit

관련 문제