在 C# 中,如何使用反射添加 FluentValidation 实例?
In C#, how can I add instances of FluentValidation using reflection?
目前,我正在 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 控制器的方式)。
我该怎么做?
感谢@Jamiec 和一位同事,我现在明白我需要做的就是:
services.AddFluentValidation(c => c.RegisterValidatorsFromAssemblyContaining<Startup>());
... 假设我所有的验证者都与 Startup.cs
在同一个项目中
目前,我正在 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 控制器的方式)。
我该怎么做?
感谢@Jamiec 和一位同事,我现在明白我需要做的就是:
services.AddFluentValidation(c => c.RegisterValidatorsFromAssemblyContaining<Startup>());
... 假设我所有的验证者都与 Startup.cs
在同一个项目中