Как зарегистрировать дженерик с двумя типами в Simple Injector?

Вот мой интерфейс и класс:

 public interface IServiceFactory<T, Y> where T : class  where Y : class
{
     T Create(ModelStateDictionary modelState);
}

public class ServiceFactory<T, Y> : IServiceFactory<T, Y>
    where T : class
    where Y : class
{

    public T Create(ModelStateDictionary modelState)
    {
        var x = (T) Activator.CreateInstance(typeof (Y), new ModelStateWrapper(modelState));
        return x;
    }
}

регистр контейнера Simple Injector:

  container.RegisterManyForOpenGeneric(typeof(IServiceFactory<, >), typeof(IServiceFactory<, >));

Как настроить Simple Injector для работы с дженериками, которые содержат более одного типа?


person Timsen    schedule 19.03.2015    source источник
comment
Какие у вас проблемы? Ошибка компиляции? Исключения во время выполнения? Программа, которая работает, но с неожиданными результатами?   -  person phoog    schedule 20.03.2015


Ответы (1)


Register(Type, IEnumerable<Assembly>) (RegisterManyForOpenGeneric в версии 2) позволяет выполнять пакетную регистрацию. Таким образом, обычно вы предоставляете Register открытый универсальный тип и один или несколько экземпляров Assembly, и метод будет перебирать типы в сборках и регистрировать все неуниверсальные реализации предоставленного универсального типа.

То, что вы, кажется, хотите, - это сопоставить открытую общую абстракцию с открытой универсальной реализацией таким образом, чтобы при запросе закрытой универсальной абстракции возвращалась закрытая общая реализация.

Вот как это сделать:

// Simple Injector v3.x
container.Register(typeof(IServiceFactory<,>), typeof(ServiceFactory<,>));

// Simple Injector v2.x
container.RegisterOpenGeneric(typeof(IServiceFactory<,>), typeof(ServiceFactory<,>));

кстати, я прочитал ваши предыдущие вопросы, и вы, кажется, введены в заблуждение ответом на этот вопрос. Ответчик правильно указывает, что ModelState является значением времени выполнения, и вы не должны вводить это значение времени выполнения в конструктор службы. Использование фабрики только переместит проблему, потому что внутри фабрики вы все еще вводите значение времени выполнения в конструктор службы. Это разбивает граф зависимостей и не позволяет вам проверить и диагностика ваших графов объектов.

В этом случае я бы посоветовал просто передать ModelState сервисному методу.

person Steven    schedule 19.03.2015