c# - 注册带有条件的开放泛型

标签 c# inversion-of-control simple-injector fluentvalidation

是否可以使用RegisterConditional不指定实现类型(类似于 Register 的工作方式,但带有条件)?

我正在使用 Simple Injector 为我的 CQRS/MVC 应用程序连接流畅的验证。到目前为止,注册验证器(由 MVC 和 CQRS 堆栈装饰器管道使用)非常简单:

container.Register(typeof(IValidator<>), assemblies, lifestyle);

container.RegisterConditional(
    typeof(IValidator<>), 
    typeof(ValidateNothingDecorator<>), 
    Lifestyle.Singleton, 
    c => !c.Handled)

新的要求意味着我需要实现类似于验证器的东西,但会提供警告。由于各种原因,我不想使用 Fluent Validation 的内置“错误级别”,这意味着我需要为给定类型创建额外的验证器,这当然会为单个类型验证错误提供多个注册。

我想做的是注册任何实现 IValidator<> 的东西除非它也实现 IProvideWarnings ,但我不想列出每个要注册的类(class)

public class MyCommand : IDefineCommand {...}
public class ValidateMyCommand : IValidator<MyCommand> {...}
public class ProvideWarningsForMyCommand : IValidator<MyCommand>, IProvideWarnings {...}
...
// would like something like... (this obviously does not work)
container.RegisterConditional(
    typeof(IValidator<>), 
    assemblies, 
    lifestyle, 
    c => !c.ImplementationType.GetInterfaces().Contains(typeof(IProvideWarnings)));

我的后备立场是找到所有实现 IValidator<> 的类型但不是IProvideWarnings并将其传递到 Register但是,我宁愿在注册调用中使用谓词来完成此操作,而不是使用不同的查找。

谢谢

最佳答案

正如您已经注意到的,简单注入(inject)器包含 Register 的重载,允许提供要注册的类型列表。虽然您可以自己反射(reflection)程序集,但 Simple Injector 包含一个方便的 GetTypesToRegister 方法来为您执行此操作。此 GetTypesToRegister 会自动为您过滤掉装饰器和泛型类型定义。

以下注册即可解决问题:

var validatorTypes =
    container.GetTypesToRegister(typeof(IValidator<>))
        .Where(typeof(IProvideWarnings).IsAssignableFrom);

container.Register(typeof(IValidator<>), validatorTypes, lifestyle);

关于c# - 注册带有条件的开放泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482901/

相关文章:

c# - 根据SizeMode转换PictureBox选择矩形

c# - 有 Lambda 脑筋急转弯的好资源吗

c# - 如何在运行时解析类型以避免多个 if else

c# - 简单注入(inject)器 - 寄存器集合

asp.net-core-mvc - ASP.NET Core v1.1 中的 IdentityServer 和简单注入(inject)器集成

c# - 在共享的 OleDbConnection/OleDbTransaction 中并行执行 ExecuteNonQuery

c# - 集成测试数据库重建性能

dependency-injection - 控制反转<依赖注入(inject)

gwt - 在 GWT 中处理 MVP 的 IoC/ "Springy"方式是什么? (提示,可能不是 Spring Roo 1.1 方式)

c# - SimpleInjector Factory Delegates - 创建具有依赖项的实例