简单的注入器如何将批处理注册的泛型类型注入构造函数

时间:2018-07-26 22:36:47

标签: c# simple-injector

简单的喷油器新手。

我已经查看了本文档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 个答案:

答案 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正在另一个程序集中。请注意,此重载确实接受多个程序集。

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