2014-09-04 3 views
1

Ninject에서 Autofac으로 응용 프로그램을 이전하고 있습니다. Autofac - 인수 이름으로 해결

우리는 생성자로 응용 프로그램 설정을 주입하기위한 특별한 이름 지정 규칙을 사용 :

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

AppSetting 매개 변수가 [ "settingName을"] ConfigurationManager.AppSettings를 사용하여 자동으로 주입 하였다.

는 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에서이 기능에 대한 대안을 찾을 수 없습니다. 이것이 자동화 된 방법으로 가능하지 않다면 초기 설정 단계에서 모든 앱 설정을 반복하는 것이 좋습니다.

무엇을해야할까요?

덕분에, Vilem

답변

0

나는이 SO 질문을 사용하여 솔루션을 만들었습니다 Register string value for concrete name of parameter

을하고 이후 트래비스 ILLIG의 제안을 사용하여 개선.

현재 Ninject와 동일한 기능을합니다. * 타입이 아닌 단지`NamedParameter` *

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'를 사용하고자하는 것입니다 :

다음은 결과입니다. 이름과 타입을 일치시킴으로써 한 클래스에'AppSetting myValue'가 있고 다른 클래스에'IValue myValue' (같은 이름이지만 다른 타입과의 종속성) 문제를 피할 수 있습니다. –

+0

감사! 이것은 훌륭한 제안 일뿐만 아니라 ResolvedParameter 클래스를 지적하면 내가 원하는 것보다 훨씬 나은 해결책이 될 것입니다. 답변을 업데이트했습니다. –