Внедрить зависимости в обработчике команд Mediatr - PullRequest
0 голосов
/ 06 июня 2019

Я использую 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 голосов
/ 12 июня 2019

Мое предложение не использовать именованные параметры.

Обернуть информацию в объект и зарегистрировать сам объект.

Возможная структура объекта:

public class ConnectionConfiguration 
{
   public string ConnectionString { get; }

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

Теперь добавьте это в ваш обработчик. Никакой дополнительной регистрации не требуется, что также не работает, потому что обработчики уже зарегистрированы, чтобы быть разрешенными как открытые универсальные, как можно видеть здесь . Регистрация ServiceFactory заботится о создании этих обработчиков.

К вашему сведению: я создал пакет nuget для регистрации MediatR с Autofac, который можно использовать даже вместе с default-service-provider .

...