Простой Инжектор регистрирует только один параметр класса, имеющего многопараметрический конструктор - PullRequest
0 голосов
/ 06 января 2020

Я являюсь частью команды, создающей "своего рода" платформу, основанную на сообщениях, где люди могут регистрировать свои обработчики сообщений с зависимостями, которые они имеют для своих обработчиков.

IDependencyResolver concept

Рабочий, получит сообщения и вызовет соответствующие обработчики. Поскольку у обработчиков есть зависимости, мы передаем реализацию IDependecyResolver через рабочий конструктор. Worker использует эту абстракцию для создания этих обработчиков.

Пользователи нашей инфраструктуры могут использовать любой DI-контейнер, который им нравится, поэтому все, что им нужно сделать, - это реализовать определенные интерфейсы, обеспечивающие абстракцию для своего любимого DI-контейнера. Моя работа состоит в том, чтобы предоставить реализацию SimpleInjector, поэтому для нашей среды SimpleInjector поддерживается сразу после установки.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я регистрирую SimpleInjectorDependencyResolver в контейнере, контейнер не может разрешить реализацию IDependencyResolver во время выполнения, и я получаю это.

Это исключение, которое я получаю.

ActivationException: конструктор типа ReactiveWorker содержит параметр с именем 'map' и типом IMessageHandlerMap , который не зарегистрирован. , Убедитесь, что IMessageHandlerMap зарегистрирован, или измените конструктор ReactiveWorker .

Вот мой код для регистрации:

registrant.Register<IDependencyResolver>(LifeSpan.Scoped);
registrant.Register<IMessageHandlerMap<TChildModule>>(t0, LifeSpan.Scoped);

работник нуждается в обоих, карта обработчика сообщений и средство разрешения зависимостей.

enter image description here

Это мой класс с параметризованными конструкторами:

public sealed class ReactiveWorker<TOwnerModule>: IWorker
{
    readonly IMessageHandlerMap<TOwnerModule> _map;
    readonly IDependencyResolver _resolver;

    public ReactiveWorker(IMessageHandlerMap<TOwnerModule> map, IDependencyResolver resolver)
    {
        _map = map;
        _resolver = resolver;
    }
}

Я надеюсь, что каждый сможет понять сценарий.

1 Ответ

0 голосов
/ 07 января 2020

Я пытаюсь создать абстрактный класс / слой для всех средств разрешения зависимостей, которые будут / будут использоваться в моем проекте.

Это похоже на то, что вы применяете Сервисный локатор анти-паттерна . Возможно, вы захотите дважды проверить, является ли то, что вы делаете, «Внедрением зависимостей» или «Расположение службы» и по возможности предотвратить размещение службы.

Кроме того, из опубликованных регистраций похоже, что вы пытаетесь осуществить пакетную регистрацию. поведение. Simple Injector содержит эту функциональность «из коробки», и стоит инвестировать в API Simple Injector, чтобы посмотреть, можете ли вы позволить инструменту выполнять свою работу.

Ваш Helper.FindConcreteImplementationsOf, например, выглядит очень похоже Метод простого инжектора Container.GetTypesToRegister. Он возвращает конкретные реализации данного типа, например:

Type[] types = container.GetTypesToRegister(typeof(IMessageHandler<>), asm);

Простой Injector также позволяет отображать абстракции open-generi c в реализации open-generi c. Используя ваш MessageHandlerMap<T>, например, вы можете сделать следующее:

`container.Register(
    typeof(IMessageHandlerMap<>),
    typeof(MessageHandlerMap<>),
    Lifestyle.Scoped);

Это обеспечивает создание закрытой версии MessageHandlerMap<T> каждый раз, когда запрашивается закрытая версия IMessageHandlerMap<T>. Это, однако, полагается на способность Auto-Wiring Simple Injector, что означает, что Simple Injector должен иметь возможность вводить все зависимости в конструктор класса. Это может означать, что вам нужно изменить конструктор MessageHandlerMap<T>, чтобы позволить Simple Injector Auto-Wire типу.

Поскольку мне неясно, что такое функция MessageHandlerMap<T> и как выглядит ее реализация Я не могу полностью получить asp того, чего вы пытаетесь достичь, и поэтому не могу дать вам более подробный c совет о внесении изменений в ваш дизайн.

Удачи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...