简单的喷油器新手。
我已经查看了本文档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方法,但找不到它。 谢谢。
答案 0 :(得分:0)
您所指的批处理注册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
正在另一个程序集中。请注意,此重载确实接受多个程序集。
如果不是这种情况,请发布堆栈跟踪信息,以及内部异常。