2017-04-18 11 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を介してこれらのサービスの動的なリストを登録することです:私はプログラム的コンテナビルダーに各サービスを登録していますエンジン(必要なサービスは、デプロイメント環境に基づいて変更できます)。

私はプログラム的にこれを行うことができます:

builder.Register(t => new List<IMyService> { 
          t.Resolve<MyService1>(), 
          t.Resolve<MyService2>(), 
          t.Resolve<MyService3>() }) 
     .Named<IList<IMyService>>("ListOfMyServices"); 

しかしたびに必要なサービスの変更をコードの再コンパイルプラスの展開を避けるために、私はAutofac XML構成を介してこれを行うにしようとしていますか?これを行う方法はありますか? XMLを設定する必要はありません

マイエンジンレジストリは、このです:

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

答えて

0

Autofac XML設定は本当に簡単で、このシナリオでは、内蔵されていないAutofac XML構成でサポートされています。行うには

一つの方法は、のAppSettings設定ファイルで指定された登録を使用し、要求されたサービスのリストを指定することです

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"); 

次に、あなたはMyEngine

このような
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>(); 

そして、あなたの中を登録することができます設定ファイル:

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

ええ、それはこの方法で行うことができ、私はそれを考えていました。しかし、私は実際にAutofac XML設定でそれが可能かどうかを知りたがっていました。あなたはそれができないと指摘したようにこれを答えとしてマークします。 –

0

私はできません電話からのコードを聞かせてください。 手順は次のとおりです。 1.すべてのサービスをXML設定で登録します。しかし、本当にあなたの設定で使うつもりのサービスだけです。 2.各サービスに名前を割り当てます。 3.必要なすべてのサービスを格納するapp.config値を作成します。 4.開始時にこのセクションを読み、これをサービスのリストに挿入します。

関連する問題