Регистрация универсального типа с универсальным аргументом в Simple Injector - PullRequest
0 голосов
/ 02 июля 2019

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

container.Register(
    typeof(IDataMerger<OriginalObject, Response<MergeObjectA>>), 
    typeof(DataMerger<MergeObjectA>));

Каков наилучший способ сделать это, кроме новой регистрации для каждого объекта слияния?

Я пытался использовать код, подобный коду ниже, но я получаю сообщение об ошибке.

container.RegisterConditional(
    typeof(IDataMerger<,>),
    typeof(DataMerger<>).MakeGenericType(typeof(ConsumerObject<,>)
        .GetGenericArguments()[1]), 
    c => c.Consumer?.ImplementationType != null
        && c.Consumer.ImplementationType.GetGenericArguments().Length == 2
        && c.Consumer.ImplementationType
              .GetGenericArguments()[0] == typeof(OriginalObject));

Любая помощь, которую вы можете оказать, будет принята с благодарностью.

1 Ответ

3 голосов
/ 02 июля 2019

В документации приведены примеры, показывающие, как это сделать.

Принимая следующие определения:

interface IDataMerger<TRequest, TResponse> { }

class DataMerger<T> : IDataMerger<OriginalObject, Response<T>> { }

Вы можете сделать следующую регистрацию:

container.Register(typeof(IDataMerger<,>), typeof(DataMerger<>));
...