我想使用autofac注入一些ValueType变量值,就像我们对Interfaces一样。我不想在引导程序中另外提到此类已命名参数化注入或使用Key。
例如:这很容易注射
注册=>
builder.RegisterType<SqlProvider>().As<ISqlProvider>();
注射=>
MyClass(ISqlProvider provider)
那么我们可以这样做:
注册=>
builder.RegisterType<int>().Named<int>("maxRetries");
注射=>
MyClass(int maxRetries)
我认为你需要的是物业注入。
http://autofac.readthedocs.io/en/latest/register/prop-method-injection.html
您可以为了简单起见使用工厂或设置提供程序,就像您的sqlprovider一样。
因为我认为你想创建一些servicelayer。伪代码:
private iSqlProvider _sqlprovider;
private ISettingsProvider _settingsProvider;
MyClass(ISqlProvider sqlprovider, ISettingProvider settingProvider)
{
_sqlprovider = sqlprovider;
_settingsProvider = settingsProvider
}
public MyClassModel GetMyAwesomeModels()
{
var settings = _setingsprovider.getSetting()
settings.maxTries
//do your magic with maxtries
}
您可以使用自定义参数和模块来使用此功能。
模块允许您为每次注册添加自定义参数。参数是Autofac每次解析注册时将调用的特殊类,以检查它是否可以提供所请求的参数。
例如 :
public class ResolvedNamedParameter : Parameter
{
public override Boolean CanSupplyValue(ParameterInfo pi,
IComponentContext context,
out Func<Object> valueProvider)
{
if (pi.ParameterType.IsValueType
&& context.IsRegisteredWithName(pi.Name, pi.ParameterType))
{
valueProvider = () => context.ResolveNamed(pi.Name, pi.ParameterType);
return true;
}
else
{
valueProvider = null;
return false;
}
}
}
然后模块为每次注册添加参数:
public class ResolvedNamedParameterModule : Module
{
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
registration.Preparing += (sender, e) =>
{
e.Parameters = new Parameter[] { new ResolvedNamedParameter() }.Concat(e.Parameters);
};
base.AttachToComponentRegistration(componentRegistry, registration);
}
}
你可以像这样使用它:
builder.RegisterModule<ResolvedNamedParameterModule>();
builder.Register(c => 3).Named<Int32>("x");
builder.Register(c => 5).Named<Int32>("y");
试试这个:
注射=>
MyClass([KeyFilter("maxRetries")]int maxRetries)
那是你在找什么?