2010-08-01 6 views
4

을 사용하여 어셈블리의 모든 유형을 등록윈저 - 성 :이 같은 어떤 것을 할 수있는 코드에서 설정 파일

container.Register(AllTypes.FromAssemblyNamed("AssemblyName")); 

내가 "Windsor.Config"구성 파일을 사용하여 같은 일을 할 수 ???

+4

왜? 코드에서 왜 그렇게하고 싶지 않습니까? –

+0

글쎄, 나는 30 개 이상의 모듈을 포함하는 거대한 프로젝트를 진행하고있다. 각 모듈은 해당 하위 시스템에 대한 프레젠테이션 UI를 제공해야합니다. 각 서브 시스템에는 : 도메인, 저장소, 코어, 응용 프로그램 서비스 등이 있습니다. 및 모든 어셈블리는 주 컨테이너에 등록되어야합니다. 그래서 모듈 중 하나에 코드를 등록해야합니다 (모듈에 대한 모든 참조가 필요함을 의미 함) 또는 등록해야 할 때마다 기본 윈저 구성 파일을 수정해야합니다. 새로운 구성 요소. –

답변

18

귀하의 의견에 회신하십시오.

또한 3 번째 방법이 있습니다 (현재 Windsor 2.5, 베타 2 - 최종 출시가 곧 예정 됨). 당신은 당신의 각 모듈을 가질 수

윈저을 참조하고,이 모든 어셈블리에서 구성 요소를 설치하는 새로운 디렉토리 검색 기능을 사용 할 수있는 것보다 각 모듈은 Installers.

의 자신의 세트를 가지고 :

// In your root assembly 
var container = new WindsorContainer(); 
container.Install( 
    FromAssembly.This(), 
    FromAssembly.InDirectory(new AssemblyFilter("Modules")), 
    Configuration.FromAppConfig() 
) 

또한 동일한 구조의 구성 요소가있는 경우 단일 설치 프로그램에서 여러 어셈블리의 구성 요소를 등록 할 수도 있습니다. See more here.

container.Register(
    AllTypes.FromAssemblyInDirectory(new AssemblyFilter("Modules")) 
     .Where(t=>t.Namespace.EndsWith(".Services")) 
     .WithService.DefaultInterface() 
); 
+0

아주 멋지다! 설치()에 대한이 과부하에 대해 알지 못했습니다. 나는 일반적으로 모든 설치 프로그램을 먼저 해결 한 다음 Install()을 개별적으로 호출합니다. – Ryan

+0

Krzysztof : 당신은 내 영웅입니다 :) 나는 당분간 투표 할 수 없습니다. 나는 15에 투표 할 것입니다. –

1

유창한 구성 API 만 있으면 응용 프로그램 규칙을 설정할 수 있으므로 새 구성 요소를 만들 때 개별적으로 등록하지 않아도됩니다 (예를 들어 보여줍니다).

1

당신은 할 수있는 사소한 시설, 예를 들어 작성할 수 있습니다

AllTypesConfig.xml을

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <facilities> 
    <facility id="alltypes"> 
     <assemblies> 
     <item>Castle.Core</item> 
     </assemblies> 
    </facility> 
    </facilities> 
</configuration> 

코드 :

public class AllTypesFacility : AbstractFacility { 
    protected override void Init() { 
     var asmList = FacilityConfig.Children["assemblies"].Children; 
     foreach (var asm in asmList) 
      Kernel.Register(AllTypes.FromAssemblyNamed(asm.Value).Pick()); 
    } 
} 


var container = new WindsorContainer(@"..\..\AllTypesConfig.xml"); 
container.AddFacility("alltypes", new AllTypesFacility()); 
container.Resolve<NullLogger>(); 

더 많은 유연성을 필요로하는 경우는 것 XML에서 유창한 구성을 표현하는 것이 점차 어려워집니다.