我正在使用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
类型的CommandHandlers.ActivityCommandHandler
中发现的所有构造函数都不能使用可用的服务和参数来调用: 无法解析构造函数System.String conStr
的参数Void .ctor(AutoMapper.IMapper, MediatR.IMediator, System.String)
答案 0 :(得分:0)
我的建议是不要使用命名参数。
在对象中包装信息并注册对象本身。
可能的对象结构:
public class ConnectionConfiguration
{
public string ConnectionString { get; }
public ConnectionConfiguration(string connectionString) => ConnectionString = connectionString;
}
builder.Register(_ => new ConnectionConfiguration(ConnectionString));
现在将其注入处理程序中。不需要额外的注册,这也行不通,因为处理程序已经注册为解析为开放泛型,如here所示。 ServiceFactory
注册负责创建这些处理程序。
仅供参考:我创建了一个用于将MediatR
注册到Autofac
的nuget软件包,甚至可以与default-service-provider一起使用。