ASP.NET Core 6.0:FluentValidation验证器已注册,但如何注册



目前,我正在开发一个使用MediatR、Automapper和FluentValidation的.NET Core 6.0项目。

我理解FluentValidation验证器是通过使用";AddValidatorsFromAssembly";类似以下的方法

public static void AddApplicationLayer(this IServiceCollection services)
{
services.AddAutoMapper(Assembly.GetExecutingAssembly());
services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());
services.AddMediatR(Assembly.GetExecutingAssembly());
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
}

然而,我正在进行的项目看起来像这个

protected internal override void AddServices(IServiceCollection services)
{
services.AddMediatR(typeof(Program));
services.Scan(s => s
.FromAssembliesOf(this.AssemblyMarkerTypes)
.AddClasses(false)
.UsingRegistrationStrategy(RegistrationStrategy.Append)
.AsImplementedInterfaces()
.WithTransientLifetime());
services.AddAutoMapper(typeof(Program));
services.AddControllers();
services.AddHealthChecks();
base.AddServices(services);
}

我不清楚FluentValidation验证器是如何在不调用AddValidatorsFromAssembly的情况下注册的。

此外,还不清楚以下代码的作用。

services.Scan(s => s
.FromAssembliesOf(this.AssemblyMarkerTypes)
.AddClasses(false)
.UsingRegistrationStrategy(RegistrationStrategy.Append)
.AsImplementedInterfaces()
.WithTransientLifetime());

如果以上扫描,注册所有DI,为什么我们需要为AddAutoMapper&AddMediator?

项目似乎正在使用Scrutor。根据提供的代码,它将在包含this.AssemblyMarkerTypes定义的某些类型子集的程序集中搜索所有非抽象类型类(包括非公共类(,并将它们注册为具有瞬态生存期的所有实现接口。

如果不能访问源代码,很难争论AssemblyMarkerTypes涵盖了哪些程序集子集,但通常应该是为项目自定义开发的所有或几乎所有程序集,包括包含验证器的程序集。

为什么我们需要为AddAutoMapper&AddMediatR

这些方法还注册了一些内部AutoMapperMediatR内容。Scan不包括它们有两个原因——首先,AutoMapperMediatR的程序集类型没有包括在AssemblyMarkerTypes中,第二个原因(基本上是它们没有包括在内的原因(——库开发人员添加了这些方法,这样库消费者就不必为它们正确运行而注册什么和如何注册而烦恼,因为肯定会有需要不同寿命和/或注册为类型的东西(即类似services.AddX<SomeConcreteType>()的东西(。

我怀疑。。。

this.AssemblyMarkerTypes

指持有要注册的服务的每个程序集中的类型的枚举。这被传递给Scrutor的扫描扩展方法来执行注册。

类型的Enumerable很可能只标记受您正在处理的解决方案所有者源代码控制的程序集。

AddMediatR和AddAutoMapper是由各自的包提供的扩展方法,用于注册和配置其操作所需的所有服务(这些服务不在AssemblyMarkerTypes标记的程序集列表中(。这就是为什么这些电话仍然是必需的。

最新更新