Простой инжектор, как внедрить пакетный зарегистрированный универсальный тип в конструктор
Простой инжектор для новичка.
Я просмотрел эту документацию 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
живет в другом собрании. Обратите внимание, что эта перегрузка принимает несколько сборок.
Если это не так, опубликуйте трассировку стека, а также с внутренними исключениями.