【问题标题】:Autofac - resolve by argument nameAutofac - 通过参数名称解​​析
【发布时间】:2014-09-04 22:21:59
【问题描述】:

我正在将应用程序从 Ninject 迁移到 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 中找到此功能的替代方案。如果这无法以自动化方式实现,我可以在初始配置步骤中循环遍历所有应用设置。

知道该怎么做吗?

谢谢, 恶灵

【问题讨论】:

    标签: c# dependency-injection autofac


    【解决方案1】:

    我使用这个 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});
        }
    }
    

    【讨论】:

    • 您可能希望使用匹配名称 和 类型的ResolvedParameter 而不仅仅是NamedParameter。通过匹配名称和类型,您可以避免在一个类中有AppSetting myValue 而在另一个类中有IValue myValue(具有相同名称但不同类型的依赖项)的问题。
    • 谢谢!这不仅是一个很好的建议,而且指出 ResolvedParameter 类会引导我找到一个更好的解决方案,这正是我想要的。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多