Простой инжектор, как внедрить пакетный зарегистрированный универсальный тип в конструктор

Простой инжектор для новичка.

Я просмотрел эту документацию https://simpleinjector.readthedocs.io/en/latest/advanced.html чтобы узнать, как работать с универсальными типами с помощью простого инжектора.

Я не могу найти в документации, как внедрить класс, основанный на регистрации пакета универсального типа.

Здесь документация дает этот пример:

container.Register<IValidator<Customer>, CustomerValidator>();
container.Register<IValidator<Employee>, EmployeeValidator>();
container.Register<IValidator<Order>, OrderValidator>();
container.Register<IValidator<Product>, ProductValidator>();

может быть зарегистрирован как

container.Register(typeof(IValidator<>), typeof(IValidator<>).Assembly);

Но какой тип данных вы используете в конструкторе, чтобы простой инжектор вводил правильный конкретный тип данных.

Например

public classaconstructor(IValidator<Order> vdator)
{
}

Я пытался найти правильный метод getinstance из документации, но не смог его найти. Спасибо.

1 ответ

API регистрации пакетов, на который вы ссылаетесь, - это просто функция, которая сканирует сборку на предмет всех закрытых реализаций IValidator<T>,

Так предполагая IValidator<> на самом деле живет в той же сборке, что и OrderValidatorэтот звонок

container.Register(typeof(IValidator<>), typeof(IValidator<>).Assembly);

приведет, по крайней мере, к созданию этой регистрации:

container.Register<IValidator<Order>, OrderValidator>();

Это означает, что этот простой юнит-тест должен пройти:

[TestMethod]
public void RegisterIValidator_GetOrderValidatorInstanceSucceeds()
{
    var container = new Container();

    container.Register(typeof(IValidator<>),  typeof(IValidator<>).Assembly);

    container.Verify();

    var orderValidator = container.GetInstance<IValidator<Order>>();

    Assert.IsInstanceOfType(orderValidator, typeof(OrderValidator));
}

Теперь, когда вы хотите использовать OrderValidator в каком-то другом классе вы действительно просите IValidator<Order> в конструкторе, как вы сделали. В этом весь смысл внедрения зависимостей и программирования в абстракции.

Простой Инжектор никогда не будет молча отказывать или вводить null, Таким образом, если инъекции не пройдут, будет описательное исключение (с возможными внутренними исключениями), сообщающее вам, где искать.

Мое лучшее предположение, с предоставленной информацией, заключается в том, что OrderValidator живет в другом собрании. Обратите внимание, что эта перегрузка принимает несколько сборок.

Если это не так, опубликуйте трассировку стека, а также с внутренними исключениями.

Другие вопросы по тегам