语境
的同时努力简化我们的MediatR代码,我们为GETALL,GetSingle,等功能创建通用的请求/响应/处理器的组合。下面你可以找到GETALL实施Autofac:注册所有MediatR处理程序作为内部类的泛型类型
public class GetAll<T> where T : class
{
public class Request : IRequest<Response>
{
}
public class Response
{
public IQueryable<T> All { get; set; }
}
public class Handler : IRequestHandler<Request, Response>
{
private readonly IRepository<T> repository;
public Handler(IRepository<T> repository)
{
this.repository = repository;
}
public Response Handle(Request message)
{
return new Response
{
All = repository.GetAll()
};
}
}
}
问题
我们似乎无法给我们所有的RequestHandlers一次使用Autofac注册。
我们能够利用我们的Autofac模块注册一个单一的特定类型的处理程序:
builder.RegisterGeneric(typeof(GetAll<>.Handler)).AsImplementedInterfaces();
但我们愿意为的IRequestHandler<,>
所有实现(而不仅仅是GETALL之一)这样做。我们已经尝试过这种使用AsClosedTypesOf
功能如文档中建议:
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>));
或
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>))
.AsImplementedInterfaces();
但这个收益率以下异常:
Autofac.Core.Registration.ComponentNotRegisteredException :'请求的服务
'MediatR.IRequestHandler<GetAll<T>.Request,GetAll<T>.Response>'
尚未注册。为避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选的依赖项。
我们在这里做错了什么(或忘记)?
也许你可以使用我的结构映射实现。由于我必须指定类型(命令<>,commandHandler <>,query <>,...),所以它远非完美,但也许可以从这里开始:https://gist.github。COM/hudo/0e9fb466c3fac5a04aa1b77cc95490e5 –