c# - 在 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)
解决方案
我的建议是不要使用命名参数。
将信息包装在对象中并注册对象本身。
可能的对象结构:
public class ConnectionConfiguration
{
public string ConnectionString { get; }
public ConnectionConfiguration(string connectionString) => ConnectionString = connectionString;
}
builder.Register(_ => new ConnectionConfiguration(ConnectionString));
现在将其注入您的处理程序。不需要额外的注册,这也不起作用,因为处理程序已经注册为开放泛型解析,如此处所示。ServiceFactory
注册负责创建这些处理程序。
仅供参考:我创建了一个用于注册的 nuget-package MediatR
,Autofac
甚至可以与default-service-provider一起使用。
推荐阅读
- mysql - 编写为备份文件创建日期目录的小型 Shell 脚本时遇到问题
- perl - 在单次迭代中提取相同模式的第一次和最后一次出现之间的所有内容
- javascript - 如何使用javascript从summernote编辑器获取和设置光标位置
- ruby-on-rails - 如何在索引视图中显示图像
- javascript - 读取 xml 文件以确定复制哪些文件的 Grunt 构建脚本
- django-viewflow - Viewflow Django - 你如何弃用一个步骤?
- row - 向下行 - Java 脚本
- c++ - 如何获取由 CreateProcess 生成的进程的真实 ID
- ios - 由于内存问题在 iOS 中多次推送 UIViewController 导致崩溃。没有崩溃痕迹
- python - 如何重命名列表列表中的项目?