C# 简单注入器如何将批量注册的泛型类型注入构造函数

C# 简单注入器如何将批量注册的泛型类型注入构造函数,c#,simple-injector,C#,Simple Injector,简单的注射器新手 我已经阅读了本文档,以了解如何使用简单注入器处理泛型类型 我在文档中找不到如何基于泛型类型批注册注入类 此处的文档给出了以下示例: container.Register<IValidator<Customer>, CustomerValidator>(); container.Register<IValidator<Employee>, EmployeeValidator>(); container.Register<IVa

简单的注射器新手

我已经阅读了本文档,以了解如何使用简单注入器处理泛型类型

我在文档中找不到如何基于泛型类型批注册注入类

此处的文档给出了以下示例:

container.Register<IValidator<Customer>, CustomerValidator>();
container.Register<IValidator<Employee>, EmployeeValidator>();
container.Register<IValidator<Order>, OrderValidator>();
container.Register<IValidator<Product>, ProductValidator>();
container.Register();
container.Register();
container.Register();
container.Register();
可以像这样注册

container.Register(typeof(IValidator<>), typeof(IValidator<>).Assembly);
container.Register(typeof(ivalidor),typeof(ivalidor.Assembly);
但是您在构造函数中使用了什么数据类型,以便simple injector注入正确的具体数据类型呢

比如说

public classaconstructor(IValidator<Order> vdator)
{
}
公共类构造器(IValidator vdator)
{
}
我试图从文档中找到正确的getinstance方法,但找不到它。
Thx.

您所指的批注册API只是一个函数,它扫描程序集以查找
IValidator
的所有封闭实现

因此,假设
IValidator
实际上与
OrderValidator
位于同一程序集中,则此调用

container.Register(typeof(IValidator<>), typeof(IValidator<>).Assembly);
container.Register(typeof(ivalidor),typeof(ivalidor.Assembly);
将导致至少创建此注册:

container.Register<IValidator<Order>, OrderValidator>();
container.Register();
这意味着这个简单的单元测试应该通过:

[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));
}
[TestMethod]
public void RegisterIValidator_GetOrderValidatorInstanceSucceeds()
{
var container=新容器();
容器.寄存器(typeof(ivalidor),typeof(ivalidor).汇编;
container.Verify();
var orderValidator=container.GetInstance();
IsInstanceOfType(orderValidator,typeof(orderValidator));
}
现在,当您想在其他一些类中使用
OrderValidator
时,您确实需要在构造函数中使用
ivalidor
。这就是依赖注入和抽象编程的全部要点

简单注入器永远不会自动失效或注入
null
。所以,如果注射失败,将有描述性异常(可能有内部异常)告诉您应该在哪里查找

根据提供的信息,我最好的猜测是,
OrderValidator
正在另一个程序集中。请注意,此重载不接受多个程序集


如果情况并非如此,则发布stacktrace,以及内部异常

简单注入器,你已经看过这个主题了吗?是的,我已经看过那个文档了。目前尚不清楚。我会猜到像var a=container.GetInstance()这样的东西;可以,但不太好,您使用容器作为服务定位器,这样做,实际上是一种反模式。您不需要显式地为构造函数执行此操作-这由依赖项解析器负责。这是什么类型的项目?aspnet mvc。我认为依赖项是通过构造函数注入的。正确。但是,您不需要手动解析这些依赖项。将Simple Injector注册为DependencyResolver,然后由ASP.NET处理。你做过类似的事情吗?最后一行是我指的。好的,谢谢!所以:1。是否有某种方法可以在整个程序中关闭simpleinjector。假设您希望逐步改进代码…随着时间的推移。。。没有simpleinjector尝试解析控制器中的每个接口。在我的项目中,它试图解析scaffolding中的所有接口您告诉MVC让Simple Injector创建控制器。如果要迁移,那么这样做可能会很乏味。在这种情况下,您可以实现自己的
DependencyResolver
,在其中,对于重构完成的控制器,您可以调用Simple Injector,而对于REST,您可以使用默认MVC,只是想让我对这段代码有点头晕。因此,如果注册处理了所有的接口依赖性,您什么时候会在测试之外使用container.GetInstance?@arod With MVC'container.GetInstance'确实不需要。根据经验,应用程序代码永远不应该调用container.GetInstance.So,那么,如何为封闭接口类型应用正确的注册,以便编译此框架代码?这段代码来自identityconfig.cs公共类ApplicationUserManager:UserManager{public ApplicationUserManager(IUserStore存储):base(store){}非常感谢