首页 > 解决方案 > 简单的注入器如何将批量注册的泛型类型注入构造函数

问题描述

简单的喷油器新手。

我已经查看了此文档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 方法,但找不到。谢谢。

标签: c#simple-injector

解决方案


您所指的批量注册 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是住在另一个集会中。请注意,此重载确实接受多个程序集。

如果不是这种情况,请发布堆栈跟踪,以及内部异常。


推荐阅读