首页 > 解决方案 > 如何使用 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

标签: dependency-injectionautofacmediatrgeneric-type-argument.net-4.7.2

解决方案


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


推荐阅读