c# - 简单的注入器如何将批量注册的泛型类型注入构造函数
问题描述
简单的喷油器新手。
我已经查看了此文档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 方法,但找不到。谢谢。
解决方案
您所指的批量注册 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>
像以前一样在构造函数中请求。这就是依赖注入和抽象编程的全部意义。
Simple Injector 永远不会静默失败或注入null
。所以如果注入失败,会有描述性异常(可能有内部异常)告诉你去哪里看。
根据提供的信息,我最好的猜测OrderValidator
是住在另一个集会中。请注意,此重载确实接受多个程序集。
如果不是这种情况,请发布堆栈跟踪,以及内部异常。
推荐阅读
- ios - 操作 queuePriority 未按预期工作
- java - (在通道 plugins.flutter.io/google_sign_in 上找不到方法 init 的实现
- c# - 使用依赖注入 IDataProtector 对控制器进行 MSTest 单元测试的问题
- javascript - 如何在函数之外访问 JSON 数据?
- html - 如何使用引导程序正确打印?
- android - Kotlin 导航片段中的 searchview.setonquerytextlistener() 类型不匹配
- java - 无论如何节点可以使用Java相对于元素节点重新排序或删除?
- javascript - JS - 用撇号替换引号
- javascript - 为集成测试设置 ngrx/data
- regex - 如何使用正则表达式将“35yrs”替换为“35 yrs”?