Не удается разрешить параметр «MediatR.ServiceFactory serviceFactory» (MediatR с Autofac) - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь запустить MediatR с Autofac в .NET Framework 4.6.2.

Моя регистрация:

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, я получаю следующую ошибку: Ни один из конструкторов, найденных с Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'типа' MediatR.Mediator ', не может быть вызван с доступными службами и параметрами: \r \ nНе удается разрешить параметр 'MediatR.ServiceFactory serviceFactory' конструктора 'Void .ctor (MediatR.ServiceFactory)

Вики (https://github.com/jbogard/MediatR/wiki)) просит нас зарегистрировать SingleInstanceFactory и MultiInstanceFactory. Но Visual Studio не является.способен разрешить любой из этих символов.

Как я могу решить эту проблему, чтобы MediatR работал с Autofac?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Я знаю, что это старый пост, но в случае, если кто-то еще гуглит по этому поводу.

Вам не хватает регистрации ServiceFactory экземпляра.

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

Взяты отсюда: Примеры MediatR

0 голосов
/ 13 июня 2018

Я предполагаю, что вы используете Mediatr v3.0.x.

Вам не хватает регистрации для SingleInstanceFactory и MultiInstanceFactory, как показано ниже.

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)); 
    });
...