Пакетный регистр Open-Generi c типов с простым инжектором - PullRequest
0 голосов
/ 05 августа 2020

Я использую Simple Injector, потому что очень легко назначить кучу общих c интерфейсов их конкрециям. Я столкнулся с препятствием, когда мои дженерики были на два уровня. Я надеялся, что есть простое решение, о котором я не думал. Вот пример подключения одной зависимости вручную:

container
    .Register<ICommandHandler<UpdateCommand<Schools>>, UpdateCommandHandler<Schools>>();

Это то, что я хотел бы сделать вместо этого:

container.Register(typeof(ICommandHandler<UpdateCommand<>>), modelAssembly);

, но это не компилируется.

1 Ответ

1 голос
/ 05 августа 2020

API автоматической регистрации Register пропускает open-generi c реализации, такие как UpdateCommandHandler<T>, потому что эти типы обычно требуют специальной обработки. Вместо этого Register выберет только не-generi c реализации.

Чтобы зарегистрировать эту open-generi c реализацию, вам нужно будет явно зарегистрировать ее:

container.Register(typeof(ICommandHandler<>), typeof(UpdateCommandHandler<>));

В качестве альтернативы, если у вас есть много реализаций open-generi c, которые могут быть зарегистрированы в любом конкретном порядке, вы можете автоматически зарегистрировать все не-generi c и open-generi c реализации (за исключением декораторов) следующим образом:

var handlerTypes =
    container.GetTypesToRegister(typeof(ICommandHandler<>), new[] { modelAssembly },
        new TypesToRegisterOptions { IncludeGenericTypeDefinitions = true });

container.Register(typeof(ICommandHandler<>), handlerTypes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...