2012-04-04 3 views
2

Ninject를 사용하여 한 구현을 다른 구현으로 리 바인딩하고 싶습니다. 그래서 다시 내 질문에Ninject 메서드 리 바인드

public class ServiceModule:NinjectModule 
{ 
    public override void Load() 
    { 
    Bind<IPersonFacade>().To<PersonFacade>(); 
    } 
} 

:

public interface IPersonFacade 
{ 
    List<string> GetPeople(); 
    string GetName(); 
} 

public class PersonFacade:IPersonFacade 
{ 
    //Implement Interface fetching data from a db. 
} 

public class PersonFacadeStub:IPersonFacade 
{ 
    //Implement Interface with some static data 
} 

나는 Ninject에 MVC 확장을 사용하여 내 NinjectModule 구현이 있어요 : 나는 정교합니다

, 나는 두 개의 서로 다른 구현이 인터페이스를 가지고 GetPeople() 메소드를 다시 바인딩하여 PersonFacadeStub의 구현을 사용하지만 IPersonFacade가 PersonFacade의 GetName을 계속 사용하도록 할 수 있습니까?

답변

2

나는 그것이 가능하지 않다고 생각한다. 다른 DI 컨테이너와 마찬가지로 NInject는 메소드가 아니라 유형을 관리합니다.

public class CompositePersonFacade : IPersonFacade 
{ 
    private readonly IPersonFacade realFacade; 
    private readonly IPersonFacade stubFacade; 

    public CompositePersonFacade(IPersonFacade realFacade, IPersonFacade stubFacade) 
    { 
     this.realFacade = realFacade; 
     this.stubFacade = stubFacade; 
    } 

    public List<string> GetPeople() 
    { 
     return stubFacade.GetPeople(); 
    } 

    public string GetName() 
    { 
     return realFacade.GetName(); 
    } 
} 

을 또한 바인딩 수정 : 동일한 인터페이스 패턴의 다른 방법에 대한 다른 유형을 사용하려면 Composite 도움이 될 수 있습니다 확인

Bind<IPersonFacade>().To<CompositePersonFacade>() 
    .WithConstructorArgument("realFacade", 
        context => context.Kernel.Get<PersonFacade>()) 
    .WithConstructorArgument("stubFacade", 
        context => context.Kernel.Get<PersonFacadeStub>()); 
+0

, 덕분에 당신의 도움이 – Nicolai

+0

일 니스를 위해. @ Nizolai Ninject.Extensions.Interception이 어떤 용도로 사용될 수 있는지 여부를 확인하십시오 (문자 그대로 당신이 원하는 것을 원하는지 여부에 달려 있습니다 ...) –

관련 문제