我有一个通用服务。
public class FileDataService<T> : IFileDataService<T>
{
public async Task<List<T>> GetListResultAsync(IFileSearcher<T> searcher)
{
return await searcher.GetResultsAsync();
}
}
我想注册一个通用服务。
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.AsClosedTypesOf(typeof(IFileDataService<>));
builder.RegisterType<SampleService>().As<ISampleService>();
builder.AddMediatR(this.GetType().Assembly);
builder.Register(c => UmbracoContext.Current).AsSelf();
以此来使用它的依赖性注入 MediatR
处理程序。
public class QueryHandler : IRequestHandler<Query, Result>
{
private readonly IFileDataService<ResultModel> _fileDataService;
private readonly ISampleService _sampleService;
private readonly UmbracoHelper _umbHelper;
public QueryHandler(
IFileDataService<ResultModel> fileDataService, ISampleService sampleService)
{
_fileDataService = fileDataService;
_sampleService = sampleService;
_umbHelper = new UmbracoHelper(UmbracoContext.Current);
}
它告诉我,处理程序没有被正确构造。
在为MediatR.IRequestHandler类型的请求构建处理程序时出错。
如何在.NET 4.7.2中正确注册和使用通用服务?Autofac
& MediatR
?
我认为你的问题是由以下事实引起的 FileDataService<T>
是 不 属于封闭型,所以 .AsClosedTypesOf(typeof(IFileDataService<>));
不会接的。
你要做的是注册 FileDataService<T>
作为一个通用组件,使用Autofac RegisterGeneric
方法;这不能通过装配体扫描机制来完成。
builder.RegisterGeneric(typeof(FileDataService<T>)).As(typeof(IFileDataService<>));
文档。https:/autofaccn.readthedocs.ioenlatestregisterregistration.html#open-generic-components。