使用autofac注册命名类型并使用string参数的名称

时间:2015-03-19 15:31:09

标签: c# dependency-injection autofac

我有以下注册(请注意,我没有完成此代码,所以它甚至可能无法按预期工作):

builder.RegisterType<SimpleInMemoryChannel>()
    .Named<IChannel>("ErrorChannel")
    .WithParameter(new NamedParameter("channelName", "ErrorChannel"));
builder.RegisterType<SimpleInMemoryChannel>()
    .Named<IChannel>("RequestCbrInput")
    .WithParameter(new NamedParameter("channelName", "RequestCbrInput"));

// Constructor: public SimpleInMemoryChannel(string channelName)

如您所见,我正在尝试使用注册对象的名称作为channelName值。代码有点冗长。我有什么方法可以自动完成任务吗?例如我想写一下:

builder.RegisterType<SimpleInMemoryChannel>()
    .Named<IChannel>("ErrorChannel");
builder.RegisterType<SimpleInMemoryChannel>()
    .Named<IChannel>("RequestCbrInput");

并自动设置channelName。

2 个答案:

答案 0 :(得分:1)

默认功能中没有任何内容可以允许这种情况发生。您需要自定义注册,或使用工厂解决。最简单的解决方案是您在评论中提到的解决方案 - 添加辅助函数来注册频道 - 这样您仍然可以使用默认的解析过程。

答案 1 :(得分:0)

使用RegisterChannel方法可能是更优雅的解决方案。

顺便说一下,如果你不能有这样的方法,你可以使用自定义模块:

public class NamedParameterModule<TServiceType> : Module
{
    private readonly string _parameterName;

    public NamedParameterModule(String parameterName)
    {
        this._parameterName = parameterName;
    }

    protected override void AttachToComponentRegistration(
        IComponentRegistry componentRegistry, IComponentRegistration registration)
    {
        KeyedService keyedService = registration.Services
            .OfType<KeyedService>()
            .FirstOrDefault(ks => ks.ServiceType == typeof(TServiceType));

        if (keyedService != null)
        {
            registration.Preparing += (sender, e) =>
            {
                e.Parameters = e.Parameters.Concat(new Parameter[] { 
                    new NamedParameter(this._parameterName, keyedService.ServiceKey)
                });
            };
        }

        base.AttachToComponentRegistration(componentRegistry, registration);
    }
}

使用builder.RegisterModule(new NamedParameterModule<IFoo>("channelName"));

注册

这个实例的dotnetfiddle:https://dotnetfiddle.net/MPfMup