Autofac 解析同一类型的多个实例

Not*_*elf 6 c# autofac mediatr

我的应用程序中有一个稍微修改过的Mediatr处理命令处理版本。我已经实现了一个 MediatorPipeline,它允许我拥有前处理器和后处理器。

public class AsyncMediatorPipeline<TRequest, TResponse> 
    : IAsyncRequestHandler<TRequest, TResponse> 
    where TRequest : IAsyncRequest<TResponse>
{
    private readonly IAsyncRequestHandler<TRequest, TResponse> inner;
    private readonly IAsyncPreRequestHandler<TRequest>[] preRequestHandlers;
    private readonly IAsyncPostRequestHandler<TRequest,TResponse>[] postRequestHandlers;

    public AsyncMediatorPipeline(IAsyncRequestHandler<TRequest, TResponse> inner, 
        IAsyncPreRequestHandler<TRequest>[] preRequestHandlers, 
        IAsyncPostRequestHandler<TRequest, TResponse>[] postRequestHandlers)
    {
        this.inner = inner;
        this.preRequestHandlers = preRequestHandlers;
        this.postRequestHandlers = postRequestHandlers;
    }

    public async Task<TResponse> Handle(TRequest message)
    {
        foreach (var preRequestHandler in preRequestHandlers)
        {
            await preRequestHandler.Handle(message);
        }

        var result = await inner.Handle(message);

        foreach (var postRequestHandler in postRequestHandlers)
        {
            await postRequestHandler.Handle(message, result);
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 autofac 注册我的预处理器,如下所示:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .As(type => type.GetInterfaces()
        .Where(type => type.IsClosedTypeOf(typeof(IAsyncPreRequestHandler<>))))
    .InstancePerLifetimeScope();
Run Code Online (Sandbox Code Playgroud)

在运行时,我得到重复的预处理器。我必须过滤删除重复项的集合。我不确定为什么会这样。如果我注释掉注册,我不会得到任何预处理器,这表明我没有在其他地方复制注册。

更新:以下是有关似乎已注册两次的类型的更多详细信息。各种类定义:

混凝土搬运工

public class ClientEditorFormIdentifierValidationHandler 
: IAsyncPreRequestHandler<AddOrEditClientCommand>{}
Run Code Online (Sandbox Code Playgroud)

命令类

public class AddOrEditClientCommand 
: IAsyncRequest<ICommandResult>{}
Run Code Online (Sandbox Code Playgroud)

命令界面

public interface IAsyncRequest<out TResponse> { }
Run Code Online (Sandbox Code Playgroud)

Not*_*elf 4

经过大量的故障排除后,我发现我实际上注册了两次处理程序。我喜欢使用 Autofac 模块将容器的配置分解为可管理的块。

在我的 MVC5 Startup 类中,我像这样注册我的模块:

builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)

深埋在“InfrastructureModule”类中的是这样一行:

builder.RegisterModule<MediatorModule>();
Run Code Online (Sandbox Code Playgroud)

这当然是重新注册我的调解处理程序...... DUH ..