2016-04-24 21 views
4

条件に基づいて依存関係を解決しようとしています。条件依存を解決するautofac

private static readonly Dictionary<string, Action<ContainerBuilder>> QRTypeDictionary = 
    new Dictionary<string, System.Action<ContainerBuilder>>() { 
      { "REST" , (builder)=> builder 
            .RegisterType<RestPublisher>() 
            .As<Publisher>()}, 
      { "DB" , (builder)=> builder 
            .RegisterType<DBPublisher>() 
            .As<Publisher>()} 
} 

これは、条件に基づいて依存関係を解決する唯一の方法であるかどうかを確認することです。私はこれまでNinjectを使用していると、次のようなものを探しています:

kernel.Bind<Publisher>() 
     .To<DbPublisher>() 
     .When(x => Defs.AppSettings.PublisherType == "DB") 

ちょうど私はあなたが望むものを達成するための3つのソリューションを見ることができることを確認して、私はAutofac

+1

'変更するには再起動するか、それが(例えば、要求の間)随時変更することができるアプリケーションを必要とするDefs.AppSettings.PublisherType'設定値はありますか? – Steven

答えて

6

で正しいことをやっているようにしたいです。名前の登録

builder.RegisterType<DbPublisher>().Named<IPublisher>("DB"); 
builder.RegisterType<RestPublisher>().Named<IPublisher>("REST"); 

builder.Register(c => { 
     var index = c.Resolve<IIndex<String, IPublisher>>(); 
     return index[Defs.AppSettings.PublisherType] 
}.As<IPublisher>(); 
  • 条件登録

    を使用してラムダ

    builder.RegisterType<DbPublisher>().AsSelf(); 
    builder.RegisterType<RestPublisher>().AsSelf(); 
    
    builder.Register(c => { 
        switch(Defs.AppSettings.PublisherType){ 
         case "DB": 
          c.Resolve<DbPublisher>(); 
          break; 
         case "REST": 
          c.Resolve<RestPublisher>(); 
          break; 
         default: 
          throw new NotSupportedException(); 
        } 
    }).As<IPublisher>(); 
    
  • を使用して

    1. Defs.AppSettings.PublisherTypeは、登録プロセス中に定義されている場合、あなたは単に条件付きであなたの依存関係を登録することができます:

      switch(Defs.AppSettings.PublisherType){ 
          case "DB": 
           builder.RegisterType<DbPublisher>().As<IPublisher>(); 
           break; 
          case "REST": 
           builder.RegisterType<RestPublisher>().As<IPublisher>(); 
           break; 
          default: 
           throw new NotSupportedException(); 
      } 
      
  • +2

    こちらのドキュメントのおすすめ方法は次のとおりです。http://docs.autofac.org/en/latest/register/registration.html#selection-of-an-implementation-by-parameter-valueしたがって、最初のオプションを追求します – Hardrada

    +0

    私の登録プロセス中に行われていました。だから私は出版社を解決するために定義された辞書を使用しました。 – Farax

    関連する問題