基于Autofac变量名称的注入

问题描述 投票:1回答:3

我想使用autofac注入一些ValueType变量值,就像我们对Interfaces一样。我不想在引导程序中另外提到此类已命名参数化注入或使用Key。

例如:这很容易注射

注册=>

builder.RegisterType<SqlProvider>().As<ISqlProvider>();

注射=>

MyClass(ISqlProvider provider)

那么我们可以这样做:

注册=>

builder.RegisterType<int>().Named<int>("maxRetries");

注射=>

MyClass(int maxRetries)
c# dependency-injection autofac
3个回答
0
投票

我认为你需要的是物业注入。

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
}

0
投票

您可以使用自定义参数和模块来使用此功能。

模块允许您为每次注册添加自定义参数。参数是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");

0
投票

试试这个:

注射=>

MyClass([KeyFilter("maxRetries")]int maxRetries)

那是你在找什么?

© www.soinside.com 2019 - 2024. All rights reserved.