2014-09-04 3 views
1

Я переношу приложение из Ninject в Autofac.Autofac - разрешить по имени аргумента

Мы использовали специальное соглашение об именах для инъекций настроек приложения в конструкторах:

public class Example{ 
    public Example(AppSetting settingName){ 
     ... 
    } 
} 

AppSetting параметр был введен автоматически с помощью ConfigurationManager.AppSettings [ "settingName"].

В Ninject это было достигнуто с помощью пользовательского поставщика:

public class AppSettingProvider : Ninject.Activation.IProvider 
{ 

    public object Create(IContext context) 
    { 
     var varName = ((Context)context).Request.Target.Name; 
     var value = new AppSetting(ConfigurationManager.AppSettings[varName]); 

     if (value.Value == null) 
     { 
      ... log ... 
     } 
     return value; 
    } 

    public Type Type 
    { 
     get { return typeof(AppSetting); } 
    } 

} 

Я не смог найти альтернативу для этой функции в Autofac. Если это невозможно в автоматическом режиме, я в порядке с настройкой всех настроек приложения во время начального этапа настройки.

Любая идея, что делать?

Спасибо, Вилем

ответ

0

Я создал решение, использующее этот SO вопрос: Register string value for concrete name of parameter

и впоследствии усовершенствовал ее с помощью предложения Travis ILLIG в.

В настоящее время это, похоже, работает точно так же, как эквивалент Ninject.

Вот результат:

public class AppSettingsModule : Module 
{ 
    protected override void AttachToComponentRegistration(
     IComponentRegistry componentRegistry, 
     IComponentRegistration registration) 
    { 
     // Any time a component is resolved, it goes through Preparing 
     registration.Preparing += InjectAppSettingParameters; 
    } 

    private void InjectAppSettingParameters(object sender, PreparingEventArgs e) 
    { 
     // check if parameter is of type AppSetting and if it is return AppSetting using the parameter name 
     var appSettingParameter = new ResolvedParameter((par, ctx) => par.ParameterType == typeof(AppSetting), (par, ctx) => new AppSetting(ConfigurationManager.AppSettings[par.Name])); 
     e.Parameters = e.Parameters.Union(new List<Parameter>{ appSettingParameter}); 
    } 
} 
+1

Вы, вероятно, хотите использовать 'ResolvedParameter', который соответствует как имя * и * тип, а не просто' NamedParameter'. При совпадении имени и типа вы можете избежать проблемы, когда у вас есть «AppSetting myValue» в одном классе и «IValue myValue» (зависимость с тем же именем, но с другим типом) в другом классе). –

+0

Спасибо! Мало того, что это отличное предложение, но указывая на то, что класс ResolvedParameter привел меня к гораздо лучшему решению, именно этого я и хотел. Обновлен ответ. –

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