是否可以使用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/