2011-09-21 3 views
7

동일한 인터페이스를 2 개 구현했으며 사용자가 로그인되어 있으면 implementation1을 사용하고 사용자가 로그인하지 않은 경우 구현 2를 사용하고 싶습니다. castle windsor로 어떻게 구성 할 수 있습니까?Castle windor 조건부 종속성 추가

답변

1

이 문제를 해결하는 한 가지 방법은 서비스를 키로 등록한 다음 필요에 따라 해결하는 것입니다.

public interface ISample 
{ 
    int Calculate(int a, int b); 
} 

class SampleB : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b + 10; 
    } 
} 

class SampleA : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b; 
    } 
} 

등록 : SampleA 필요할 때

 container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient); 
     container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient); 

//이 해결합니다.

var sampleA = container.Resolve<ISample>("SampleA"); 

// SampleB가 필요할 때 해결.

var sampleB = container.Resolve<ISample>("SampleB"); 
+1

어디에서'container.Resolve() '를 부를까요? –

+0

내부 구현을 변경/연장하지 않는 한, 사용자가 로그인했는지 여부를 윈서가 알 수있는 방법이 없습니다. 그 사이에 '로그인 요소'를 고려하고 원하는 구현을 제공하는 Decider 클래스가있을 수 있습니다. –

+0

Windsor *는 이에 대한 메커니즘을 가지고 있습니다 (mookid의 답변 참조). 내부 구현을 전혀 변경할 필요가 없습니다. –

7

사용 가능한 구현 예에 따라 선택할 수있을 것 handler selector, 추가 할 수 있습니다 Thread.CurrentPrincipal이 설정되었는지 (정확하게 기억한다면 ASP.NET/MVC에서는 HttpContext.Current.Request.IsAuthenticated). 핸들러 선택은 아마 다음과 같이 다소 보일 것이다

:

public class MyAuthHandlerSelector : IHandlerSelector 
{ 
    public bool HasOpinionAbout(string key, Type service) 
    { 
     return service == typeof(ITheServiceICareAbout); 
    } 

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) 
    { 
     return IsAuthenticated 
      ? FindHandlerForAuthenticatedUser(handlers) 
      : FindGuestHandler(handlers); 
    } 

    bool IsAuthenticated 
    { 
     get { return Thread.CurrentPrincipal != null; } 
    } 
    // .... 
} 
핸들러 선택기의

유일한 단점은 그들이 컨테이너에서 가져온하지 않을 것입니다 - 그들은 등록에 컨테이너 인스턴스로 추가하고, 즉 시간 때문에 의존성 주입, 라이프 스타일 관리 등을하지 않아도되지만이를 완화 할 수있는 방법이 있습니다. 어떻게 수행 할 수 있는지 궁금하다면 F.T.Windsor을 살펴보십시오.

+1

3.0 버전으로 변경된 사항이 궁금한 경우 - 여전히 외부 시설이 필요한 경우를 의미합니다. – Giedrius