2013-05-29 2 views
4

미안 일부 구글 - ING 일을 시도하고 그래서 여기에 어떤 일치를 발견 간다하지 않은 전에이는 방지 중복 등록 - 성 윈저

나는 성 윈저 컨테이너를 가지고 .... 요구되고있는 경우 나는

container.Register(AllTypes.FromAssemblyNamed("App.Infrastructure") 
    .Where(x => !x.IsAbstract && !x.IsInterface) 
    .WithService.DefaultInterface() 

이 그러나 나는 그에서 종속성을 해결하기 위해 같은 방식으로 다른 DLL을 등록하고자, 좋은 작품 ... (컨테이너 IWindsorContainer의 인스턴스) 다음과 같은 방법을 사용하여 내 구성 요소를 추가 할 수 있습니다. ..

이제 동일한 인터페이스 해상도가 추가되면 윈저에 알림을 보낼 수 있습니다. 즉, 인터페이스 당 하나의 구현 자만 있습니다 (둘 이상 존재하는 경우 첫 번째 가져옴).

희망은 나 자신을 충분히 설명했다. Castle Windsor 버전을 사용하고 있습니다 : 2.5.1.0 및 업그레이드/버전 변경은 실제로 옵션이 아닙니다.


업데이트 :

나는 그들이 등록 된 후 중복 등록을 제거하여이 문제를 해결했습니다. 등록하면 예외를 던질 등록을 조정할 수있는 경우

var registeredServices = new Dictionary<Type, string>(); 
foreach (var node in container.Kernel.GraphNodes) 
{ 
    var cmp = ((Castle.Core.ComponentModel)node); 
    Type t = cmp.Service; 
    if (registeredServices.ContainsKey(t)) 
     container.Kernel.RemoveComponent(cmp.Name); 
    else 
     registeredServices.Add(t, cmp.Implementation.FullName); 
} 
+0

첫 번째 등록이 해결되는 기본 동작이어야합니다. – maxlego

+0

안녕하세요 @maxlego. 나는 네가 의미하는 바를 이해하지 못한다. 너는 네가 의미하는 바를 정교하게 제발 할 수 있겠 니? –

+1

같은 인터페이스로 여러 구성 요소를 등록하는 경우 이 인터페이스로 해결하면 먼저 등록 된 구성 요소를 얻게됩니다. 나는 이것이 당신이 원하는 것임을 이해합니다. 그렇지 않습니까? – maxlego

답변

6

은 몰라요 ... 그때 아래 루프를 완료,하지만이 간단한 코드 조각은 당신에게

var registeredServices = new List<Type>(); 

foreach (var node in container.Kernel.GraphNodes) 
{ 
    foreach (var t in ((Castle.Core.ComponentModel)node).Services) 
    { 
     if (registeredServices.Contains(t)) 
      throw new Exception(string.Format("service {0} already registered", t)); 
     registeredServices.Add(t); 
    } 
} 
4
도움이 될 후

2.5에서 당신은 모든 등록 후, 각 처리기의 .Service 볼 수 있습니다 다음

var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object)); 

를 호출하고 중복이 있는지 찾을 수 eith 어쨌든 도움이되는 예외를 던지거나 그 라인을 따라 뭔가를 던지십시오.

나는 이것이 당신이 테스트에서하고 싶지 않은 것이지, 런타임에서는 그렇지 않다고 생각한다.

+0

typo there - container.Kernet :} – maxlego

+0

감사합니다. Krzysztof, 이것이 체크인을 수행하려는 정확한 위치입니다. 중복 된 등록을 찾는 단위 테스트가 있는데,이를 감지하기위한 방법이 필요했습니다. 무엇이 복제되고 있는지. 고마워요 두 솔루션을 시도하고 내 결과를 다시보고합니다! –