无法解析参数' MediatR.ServiceFactory serviceFactory' (MediatR with Autofac)

时间:2018-06-07 12:52:56

标签: autofac mediatr

我试图在.NET Framework 4.6.2中使用Autofac运行MediatR。

我的注册:

public class MediatorModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterSource(new ContravariantRegistrationSource());
        builder.RegisterAssemblyTypes(typeof(IMediator ).Assembly).AsImplementedInterfaces();
        builder.RegisterType<HealthCheckQueryHandler>().As<IRequestHandler<HealthCheckQuery, HttpStatusCode>>();
    }
}

我的控制器:

[RoutePrefix("api/v1/healthcheck")]
public class HealthCheckController : ApiController
{
    private readonly IMediator _mediator;

    public HealthCheckController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpGet]
    [Route("")]
    public async Task<HttpStatusCode> Get()
    {
        var query = new HealthCheckQuery();
        var result = await _mediator.Send(query);
        return result;
    }
}

当我尝试点击此api方法时,收到以下错误: 没有任何构造函数与&#39; Autofac.Core.Activators.Reflection.DefaultConstructorFinder&#39;在类型&#39; MediatR.Mediator&#39;可以使用可用的服务和参数调用:\ r \ n无法解析参数&#39; MediatR.ServiceFactory serviceFactory&#39;构造函数&#39; Void .ctor(MediatR.ServiceFactory)

wiki(https://github.com/jbogard/MediatR/wiki)要求我们注册SingleInstanceFactory和MultiInstanceFactory。但是Visual Studio无法解析这些符号中的任何一个。

如何解决此问题以使MediatR与Autofac配合使用?

2 个答案:

答案 0 :(得分:1)

我假设您使用的是Mediatr v3.0.x。

您遗漏了SingleInstanceFactoryMultiInstanceFactory的注册信息,如下所示。

builder.Register<SingleInstanceFactory>(ctx => {
    IComponentContext c = ctx.Resolve<IComponentContext>(); 
        return type => {
            Object o; 
            return c.TryResolve(type, out o) ? o : null; 
        };
    }); 

builder.Register<MultiInstanceFactory>(ctx => {
    IComponentContext c = ctx.Resolve<IComponentContext>(); 
    return type => (IEnumerable<Object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(type)); 
    });

答案 1 :(得分:1)

我知道这是一篇旧文章,但万一其他人用谷歌搜索。

您缺少注册ServiceFactory实例。

builder.Register<ServiceFactory>(ctx =>
{
    var c = ctx.Resolve<IComponentContext>();
    return t => c.Resolve(t);
});

从这里拍摄:MediatR Examples