2014-09-04 59 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此功能的替代品。如果这是不可能的自动化方式,我可以在初始配置步骤循环所有应用程序设置。

不知道该怎么办?

感谢, Vilem

回答

0

我使用这太问题已经创建了一个解决方案: Register string value for concrete name of parameter

,随后使用特拉维斯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”(具有相同名称但不同类型的依赖项)的问题。 – 2014-09-05 15:00:32

+0

谢谢!这不仅是一个很好的建议,而且指出ResolvedParameter类让我得到了一个更好的解决方案,这正是我想要的。更新了答案。 – 2014-09-05 18:07:58