【问题标题】:In C#, how can I add instances of FluentValidation using reflection?在 C# 中,如何使用反射添加 FluentValidation 实例?
【发布时间】: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();

我想到了:

  1. 不必同时传递TTypeTValidator,因为TValidator 的每个实例都是根据TType 定义的。

  2. 这样做不仅多余而且危险,因为不能保证TType 将正确对应TValidator

  3. 系统应该有一种方法可以自动发现存在哪些验证器,然后自动添加它们(类似于添加 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


【解决方案1】:

感谢@Jamiec 和一位同事,我现在明白我需要做的就是:

services.AddFluentValidation(c =&gt; c.RegisterValidatorsFromAssemblyContaining&lt;Startup&gt;());

...假设我所有的验证器都与 Startup.cs 位于同一个项目中

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多