【发布时间】:2021-10-16 21:12:49
【问题描述】:
目前,我正在 Startup.cs 中添加验证器,例如:
public void ConfigureContainer(ContainerBuilder builder)
{
Register<Signer, SignerValidator>(builder);
Register<ContractBase, ContractBaseValidator>(builder);
Register<ContractGridop, ContractGridopValidator>(builder);
Register<ContractSepa, ContractSepaValidator>(builder);
Register<ContractVollmacht, ContractVollmachtValidator>(builder);
}
private static void Register<TType, TValidator>(
ContainerBuilder builder
) =>
builder.RegisterType<TValidator>()
.As<IValidator<TType>>()
.SingleInstance();
我想到了:
-
不必同时传递
TType和TValidator,因为TValidator的每个实例都是根据TType定义的。 -
这样做不仅多余而且危险,因为不能保证
TType将正确对应TValidator。 -
系统应该有一种方法可以自动发现存在哪些验证器,然后自动添加它们(类似于添加 API 控制器的方式)。
我该怎么做?
【问题讨论】:
-
可能重复:stackoverflow.com/questions/63023438/… - 你也可以通过一些类型约束来解决问题 2。
-
@Jamiec,为链接欢呼。虽然它确实帮助我改进了我的解决方案(我不知道我们为什么使用 Autofac),但它并没有完全回答我的问题。 1.我对“Assemblies”一无所知,所以我不一定要尝试从这些中添加验证器;和 2. 除非我遗漏了什么,否则我仍然需要显式添加每个验证器。我想知道系统是否有办法自动添加扩展
AbstractValidator的所有内容。 -
“程序集”正是 .NET 代码被编译成的内容(那些以 .exe 或 .dll 结尾的东西)-您是否阅读了公认的答案,尤其是这一点
Registering using “RegisterValidatorsFromAssemblyContaining” method registers all validators derived from AbstractValidator class within the assembly containing the specified type. -
我读到了,但我并不完全清楚该做什么或做什么,因为在查看其他 Q/A 之前,我不知道有一个名为“Assembly”的概念,现在我知道它存在,但我仍然不清楚如何使用它,包括如何获取对当前(或并发?)程序集的引用以发送到可能接受它的方法。
-
您可以将
RegisterValidatorsFromAssemblyContaining与您的any 验证器类一起使用,它会注册all 其他验证器类。有关更多信息和示例,请参阅 FV 文档:docs.fluentvalidation.net/en/latest/…
标签: c# reflection dry fluentvalidation type-safety