在Mediatr命令处理程序中注入依赖项

时间:2019-06-06 08:07:12

标签: c# autofac 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类型的CommandHandlers.ActivityCommandHandler中发现的所有构造函数都不能使用可用的服务和参数来调用:   无法解析构造函数System.String conStr的参数Void .ctor(AutoMapper.IMapper, MediatR.IMediator, System.String)

1 个答案:

答案 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一起使用。