Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注册Mediatr IPipelineBehavior的多个实现时了解Asp.net核心依赖项注入_C#_Asp.net Core_.net Core_Dependency Injection_Mediatr - Fatal编程技术网

C# 注册Mediatr IPipelineBehavior的多个实现时了解Asp.net核心依赖项注入

C# 注册Mediatr IPipelineBehavior的多个实现时了解Asp.net核心依赖项注入,c#,asp.net-core,.net-core,dependency-injection,mediatr,C#,Asp.net Core,.net Core,Dependency Injection,Mediatr,我看到以下代码使用Asp.NETCore3.1,Mediatr使用IPipelineBehavior services.AddTransient(typeof(IPipelineBehavior),typeof(RequestPerformanceBehaviour)); AddTransient(typeof(IPipelineBehavior),typeof(RequestValidationBehavior)); AddTransient(typeof(IPipelineBehavior

我看到以下代码使用Asp.NETCore3.1,Mediatr使用IPipelineBehavior

services.AddTransient(typeof(IPipelineBehavior),typeof(RequestPerformanceBehaviour));
AddTransient(typeof(IPipelineBehavior),typeof(RequestValidationBehavior));
AddTransient(typeof(IPipelineBehavior),typeof(unhandledexceptionbehavior));

使用System.Collections.Generic;
使用System.Linq;
使用系统线程;
使用System.Threading.Tasks;
使用FluentValidation;
使用MediatR;
使用ValidationException=CleanArchitecture.Application.Common.Exception.ValidationException;
公共类RequestValidationBehavior:IPipelineBehavior
TRequest在哪里:IRequest
{
私有只读IEnumerable\u验证器;
公共RequestValidationBehavior(IEnumerable验证器)
{
_验证器=验证器;
}
公共任务句柄(TRequest请求、CancellationToken CancellationToken、RequestHandlerDelegate next)
{
if(_validators.Any())
{
var context=新的ValidationContext(请求);
var failures=\u验证程序
.选择(v=>v.Validate(上下文))
.SelectMany(结果=>result.Errors)
.其中(f=>f!=null)
.ToList();
如果(failures.Count!=0)
{
抛出新的ValidationException(失败);
}
}
返回next();
}
}
然而,基于我对asp.net DI的有限理解,
\u验证器
不应该是
IValidator
类型吗?为什么它的类型是
IEnumerable

运行代码时,
\u验证器
的长度始终为1

我在哪里可以找到更多关于DI何时将实现解析为IEnumerable的文档

更新 感谢并帮助我理解。我了解到这就是dotnetdi解析同一接口的多个实现的方式。要获取所有实现,我将使用
IEnumerable
获取实现它的所有服务。下面是一个演示此功能的工作示例:

使用系统;
使用System.Collections.Generic;
使用Microsoft.Extensions.DependencyInjection;
命名空间DotnetCoreDependencyInjection
{
班级计划
{
静态void Main(字符串[]参数)
{
IServiceCollection服务=新的ServiceCollection();
services.AddSingleton();
services.AddSingleton();
var serviceProvider=services.BuildServiceProvider();
使用var scope=serviceProvider.CreateScope();
//DI将把IEnumerable解析为IValidator的所有实现
var validators=scope.ServiceProvider.GetService();
foreach(验证器中的var验证器)
{
validator.Validate(新装运{SourceAddress=“Source Address”,DestinationAddress=“Destination Address”});
}
}
}
分类装运
{
公共int Id{get;set;}
公共字符串DestinationAddress{get;set;}
公共字符串源地址{get;set;}
}
接口虚拟仪器
{
无效验证(T装运);
}
类ValidateSourceAddress:IValidator
{
公共无效验证(装运)
{
WriteLine($“验证源地址:{shipping.SourceAddress}”);
}
}
类ValidateDestinationAddress:IValidator
{
公共无效验证(装运)
{
Console.WriteLine($“验证目标地址:{shipping.DestinationAddress}”);
}
}
}

注册同一接口的多个实现时,DI可以使用包含所有实现的IEnumerable进行解析。如果不指定IEnumerable,那么它将只包含第一个实现。

注入
IEnumerable
意味着可以为同一
t
实现多个
IValidator
类。例如,假设
T
是一个
ShipOrder
。您可以有
ordershouldboutbeshipped
ordershouldbayed
类,它们都实现了
ivalidor