2017-04-18 2 views
0

프로그래밍 방식 및 XML을 통해 종속성을 구성하려고합니다. 유형이 IMyService 인 서비스 목록이 있습니다. 내가 프로그래밍 방식으로 컨테이너 빌더 각 서비스에 등록 :Autofac XML 구성에 일반 목록 서비스를 등록 할 수 있습니까?

ContainerBuilder builder = new ContainerBuilder(); 
builder.Register(t => new Logger()).As<ILogger>(); 

builder.Register(t => new MyService1(t.Resolve<ILogger>())); 
builder.Register(t => new MyService2(t.Resolve<ILogger>())); 
builder.Register(t => new MyService3(t.Resolve<ILogger>())); 
builder.Register(t => new MyService4(t.Resolve<ILogger>())); 
builder.Register(t => new MyService5(t.Resolve<ILogger>())); 

내가 지금하고 싶은 무엇을, 나는 이들 사이에만 필요한 서비스를 주입 할 수 있도록 XML을 통해 이러한 서비스의 동적 목록을 등록하는 것입니다 내 엔진 (필수 서비스는 전개 환경에 따라 변경 될 수 있음).

나는대로 프로그래밍 방식으로이 작업을 수행 할 수 있습니다

코드를 재 컴파일 플러스 배포마다 필요한 서비스 변경을 방지하기 위해, 내가 Autofac의 XML 구성을 통해이 작업을 수행하려고하지만
builder.Register(t => new List<IMyService> { 
          t.Resolve<MyService1>(), 
          t.Resolve<MyService2>(), 
          t.Resolve<MyService3>() }) 
     .Named<IList<IMyService>>("ListOfMyServices"); 

? 이것을 할 수있는 방법이 있습니까? XML을 구성 할 필요가 없습니다

내 엔진 레지스트리는 이것이다 :

builder.Register(t => new MyEngine(t.ResolveNamed<IList<IMyService>>("ListOfMyServices"))); 

답변

0

Autofac XML 구성은 정말 간단하고이 시나리오는 내장되지 Autofac XML 구성 지원. 할

한 가지 방법은

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterType<Logger>().As<ILogger>(); 

builder.RegisterType<MyService1>().As<IMyService>().Named<IMyService>("Service1"); 
builder.RegisterType<MyService2>().As<IMyService>().Named<IMyService>("Service2"); 
builder.RegisterType<MyService3>().As<IMyService>().Named<IMyService>("Service3"); 
builder.RegisterType<MyService4>().As<IMyService>().Named<IMyService>("Service4"); 
builder.RegisterType<MyService5>().As<IMyService>().Named<IMyService>("Service5"); 

그런 다음이

String[] namedServices = ConfigurationManager.AppSettings["MyServices"].Split(','); 

builder.Register(c => { 
      var services = namedServices.Select(s => c.ResolveNamed<IMyService>(s)); 
      return new MyEngine(services.ToList()); 
     }) 
     .As<IMyEngine>(); 

같은과에 MyEngine을 등록 할 수 있습니다 이름 등록을 사용하고 appSettings는 구성 파일에서 요청 된 서비스의 목록을 지정하는 것입니다 귀하의 설정 파일 :

<configuration> 
    <appSettings> 
    <add key="MyServices" value="Service1,Service2,Service5" /> 
    </appSettings> 
</configuration> 
+0

그래,이 방법으로 할 수 있고 나는 그것을 생각 해냈다. 그러나 실제로 Autofac XML 구성을 통해 수행 할 수 있는지 알고 싶었습니다. 당신이 대답 할 수 없다는 것을 지적하면서 이것을 대답으로 표시하십시오. –

0

나는 할 수 없다. 전화 코드. 그러나 단계는 다음과 같습니다. 1. 모든 서비스를 XML 구성에 등록하십시오. 그러나 서비스에 대해서만 구성을 사용하려고합니다. 2. 각 서비스에 이름을 지정하십시오. 3. 필요한 모든 서비스를 저장하는 app.config 값을 만듭니다. 4.이 섹션을 읽고 서비스 목록에 삽입하십시오.

관련 문제