无法解析参数 'MediatR.ServiceFactory serviceFactory'(带 Autofac 的 MediatR)
Cannot resolve parameter 'MediatR.ServiceFactory serviceFactory' (MediatR with Autofac)
我正在尝试 运行 MediatR 与 .NET Framework 4.6.2 中的 Autofac。
我的注册:
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' 上找到的构造函数中的 None 可以使用可用的服务和参数调用:\r\nCannot 解析构造函数 'Void .ctor 的参数 'MediatR.ServiceFactory serviceFactory' (MediatR.ServiceFactory)
wiki (https://github.com/jbogard/MediatR/wiki) 要求我们注册 SingleInstanceFactory 和 MultiInstanceFactory。但是 Visual Studio 无法解析这些符号中的任何一个。
如何解决此问题以使 MediatR 与 Autofac 一起工作?
我假设您使用的是 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));
});
我知道这是一个旧的 post,但以防万一其他人用谷歌搜索这个。
您没有注册 ServiceFactory
实例。
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
取自此处:MediatR Examples
我正在尝试 运行 MediatR 与 .NET Framework 4.6.2 中的 Autofac。
我的注册:
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' 上找到的构造函数中的 None 可以使用可用的服务和参数调用:\r\nCannot 解析构造函数 'Void .ctor 的参数 'MediatR.ServiceFactory serviceFactory' (MediatR.ServiceFactory)
wiki (https://github.com/jbogard/MediatR/wiki) 要求我们注册 SingleInstanceFactory 和 MultiInstanceFactory。但是 Visual Studio 无法解析这些符号中的任何一个。
如何解决此问题以使 MediatR 与 Autofac 一起工作?
我假设您使用的是 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));
});
我知道这是一个旧的 post,但以防万一其他人用谷歌搜索这个。
您没有注册 ServiceFactory
实例。
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
取自此处:MediatR Examples