如何在Autofac注册通用服务?

问题描述 投票:0回答:1

我有一个通用服务。

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?

dependency-injection autofac mediatr generic-type-argument .net-4.7.2
1个回答
1
投票

我认为你的问题是由以下事实引起的 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。

© www.soinside.com 2019 - 2024. All rights reserved.