2016-04-24 5 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") 

Просто хочу, чтобы убедиться, что я делаю правильно с Autofac

+1

ли 'Defs.AppSettings.PublisherType' значение конфигурации, которая нуждается в перезапуске приложения, чтобы изменить, или это может изменить время от времени (между запросами, например)? – Steven

ответ

6

Я вижу 3 решения, чтобы достичь того, что вы хотите ,

  1. Использование лямбда

    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>(); 
    
  2. Использование имени регистрация

    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>(); 
    
  3. Условная регистрация

    если 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

So моя работа велась в процессе регистрации. Поэтому я использовал определенный словарь (чтобы уменьшить сложность цикломы), чтобы разрешить издателю. – Farax

Смежные вопросы