首页 > 解决方案 > 在 Mediatr 命令处理程序中注入依赖项

问题描述

我正在使用 Autofac 和 mediatr。流是来自的消息EventHub,我对其进行处理并将其发送到相应的命令处理程序。api我可以从项目的角度注入一些东西,使用builder.

builder.Register(ctx => {
   var userInfo = ctx.Resolve<UserContextProvider>().GetUserInformation();
   var connectionString = ResolveConnectionString(userInfo);
   return new Repository(connectionString);
}).As<IRepository>();

由于消息来自事件中心,我需要动态解析这些参数。我已将其注入IComponentContext到我的消息处理器类中,并正在尝试解析参数。

_componentContext.Resolve<ActivityCommandHandler>(new NamedParameter("conStr", ConnectionString));

当我在处理程序构造函数上放置断点时,我可以看到conStr执行上述行的时间。

这是正确的做法吗?

当我使用发送命令_mediatr.send(mycommand)时,出现以下异常。

Autofac.Core.Activators.Reflection.DefaultConstructorFinder无法使用可用的服务和参数调用on 类型的构造CommandHandlers.ActivityCommandHandler函数:无法解析System.String conStr构造函数的参数Void .ctor(AutoMapper.IMapper, MediatR.IMediator, System.String)

标签: c#autofacmediatr

解决方案


我的建议是不要使用命名参数。

将信息包装在对象中并注册对象本身。

可能的对象结构:

public class ConnectionConfiguration 
{
   public string ConnectionString { get; }

   public ConnectionConfiguration(string connectionString) => ConnectionString = connectionString;
}
builder.Register(_ => new ConnectionConfiguration(ConnectionString));

现在将其注入您的处理程序。不需要额外的注册,这也不起作用,因为处理程序已经注册为开放泛型解析,如此处所示ServiceFactory注册负责创建这些处理程序。

仅供参考:我创建了一个用于注册的 nuget-package MediatRAutofac甚至可以与default-service-provider一起使用。


推荐阅读