dependency-injection - 如何使用 Autofac 注册通用服务?
问题描述
我有一个通用服务:
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 类型的请求构造处理程序时出错
如何使用Autofac
&在 .NET 4.7.2 中正确注册和使用通用服务MediatR
?
解决方案
FileDataService<T>
我认为您的问题是由不是封闭类型的事实引起的,所以.AsClosedTypesOf(typeof(IFileDataService<>));
不会接它。
您要做的是使用 Autofac方法注册FileDataService<T>
为通用组件;RegisterGeneric
这不能通过程序集扫描机制来完成。
builder.RegisterGeneric(typeof(FileDataService<T>)).As(typeof(IFileDataService<>));
文档:https ://autofaccn.readthedocs.io/en/latest/register/registration.html#open-generic-components