동일한 인터페이스를 2 개 구현했으며 사용자가 로그인되어 있으면 implementation1을 사용하고 사용자가 로그인하지 않은 경우 구현 2를 사용하고 싶습니다. castle windsor로 어떻게 구성 할 수 있습니까?Castle windor 조건부 종속성 추가
7
A
답변
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");
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
관련 문제
- 1. 조건부 종속성
- 2. 추가 종속성/DLL/라이브러리
- 3. Xcode와의 추가 종속성 연결
- 4. 컨트롤에 종속성 속성 추가
- 5. 조건부 추가 파이썬
- 6. 여러 콘크리트 구현을 사용하여 Castle Windsor 종속성 삽입
- 7. Castle Windsor를 사용할 때 WCF 서비스 간의 종속성 처리
- 8. 새로운 솔루션에 자동으로 종속성 추가
- 9. 프로젝트에 .net dll 종속성 추가
- 10. 조건부 특성 추가 Builder :: XmlMarkup
- 11. 생성자에서 종속성 제거
- 12. Intellij Maven 모듈에 모듈 종속성 추가
- 13. 쉘을 통해 기존 pom.xml에 종속성 추가
- 14. 배포 가능 종속성 추가 - MVC 없음 확인란
- 15. Drupal의 Chameleon 테마에 조건부 스타일 시트 추가
- 16. 조건부 서식에서 추가 기능의 UDF 사용
- 17. Linq를 사용하여 동적으로 조건부 결합 추가
- 18. 조건부 테스트를 추가 할 때 속도가 느립니다.
- 19. 조건부 의존성 주입
- 20. 조건부 대리인?
- 21. 종속성 프로젝트 지정 : 복사 - 종속성?
- 22. Castle Windsor 인터셉터를 사용한 성능
- 23. 성 윈저를 사용하여 winforms 앱에서 순환 종속성
- 24. Castle Windsor Build Error
- 25. SubSonic vs Castle ActiveRecord
- 26. Castle Windsor v2로 업그레이드해야합니까?
- 27. Fluent 인터페이스가있는 Castle 인터셉터
- 28. 조건부 관계
- 29. 윈저 컨테이너의 Castle Dynamic Proxy
- 30. JasperReports 서블릿 종속성
어디에서'container.Resolve() '를 부를까요? –
내부 구현을 변경/연장하지 않는 한, 사용자가 로그인했는지 여부를 윈서가 알 수있는 방법이 없습니다. 그 사이에 '로그인 요소'를 고려하고 원하는 구현을 제공하는 Decider 클래스가있을 수 있습니다. –
Windsor *는 이에 대한 메커니즘을 가지고 있습니다 (mookid의 답변 참조). 내부 구현을 전혀 변경할 필요가 없습니다. –