Azure Function v4 中的 MediatR

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

我决定在我的 Azure Function 应用程序中使用 MediatR。我在我的 Azure Function 项目中下载了 MediatR v12.1.1。我有一个带有名称服务的依赖项目(类库),其中有查询(实现 IRequest)和处理程序(实现 IRequestHandler)。 我在 Azure Function 项目的 Startup.cs 中添加了以下行:

 public override void Configure(IFunctionsHostBuilder builder)
        {
    builder.Services.AddMediatR(cfg =>
            {
                cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
            });
    }

我的功能:

 public class SomeName
    {
        private readonly IMediator _mediator;

        public SomeName(IMediator mediator)
        {
            _mediator = mediator;
        }

        [FunctionName("SomeName")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var tokenString = req.Query["token"];
            var token = Guid.Parse(tokenString);
            var query = new GetUserDetail(token);
            var result = await _mediator.Send(query);
            return result != null ? new OkObjectResult(result) : new NotFoundResult();
        }
    }

作为 DI 容器,我使用 Autofac。当我运行我的函数时,出现以下错误:

System.Private.CoreLib:执行函数时出现异常:SomeName。 Autofac:请求的服务“MediatR.IRequestHandler`2[Some_info]”尚未注册。为了避免这种异常,可以注册一个组件来提供服务,使用 IsRegistered() 检查服务注册,或者使用 ResolveOptional() 方法来解析可选依赖项。

如何修复该错误?

.net-core azure-functions autofac mediatr
1个回答
0
投票

Assembly.GetExecutingAssembly()
返回包含您的函数的程序集。 Mediatr 扫描它以查找实现
IRequestHandler<,>
接口的类型。由于您在依赖项目中有命令和查询,因此此程序集扫描会导致找到 0 个类型。这意味着你需要通过不同的装配。

你可以尝试一下 通过

RegisterServicesFromAssemblyContaining<AnyTypeFromYourOtherProject>()
进行注册,其中
AnyTypeFromYourOtherProject
是该项目中包含您的请求的类型

示例

.AddMediatR(cfg =>
{
    cfg.RegisterServicesFromAssemblyContaining<Class1>();
});

文件夹结构

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