我将应用程序从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
答案 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});
}
}