Autofac - 按参数名称解​​析

时间:2014-09-04 22:21:59

标签: c# dependency-injection autofac

我将应用程序从Ninject迁移到Autofac。

我们使用特殊的命名约定将应用程序设置注入构造函数:

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

使用ConfigurationManager.AppSettings [" settingName"]自动注入AppSetting参数。

在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

1 个答案:

答案 0 :(得分: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});
    }
}