C# ASP.NET核心API,Mediatr发送方法引发异常无法解析类型的服务

C# ASP.NET核心API,Mediatr发送方法引发异常无法解析类型的服务,c#,asp.net-core,.net-core,fluentvalidation,mediatr,C#,Asp.net Core,.net Core,Fluentvalidation,Mediatr,我有一个ASP.NET核心API,我正在尝试将FluentValidation与Mediatr一起使用 当前,当控制器方法试图在其生成的mediatr实例上调用Send时: 引发异常:中的“System.InvalidOperationException” Microsoft.Extensions.DependencyInjection.dll:'无法解析 尝试激活时类型“GetApplicationQuery”的服务 “GetApplicationQueryValidator.” 查询、验证程

我有一个ASP.NET核心API,我正在尝试将FluentValidation与Mediatr一起使用

当前,当控制器方法试图在其生成的mediatr实例上调用Send时:

引发异常:中的“System.InvalidOperationException” Microsoft.Extensions.DependencyInjection.dll:'无法解析 尝试激活时类型“GetApplicationQuery”的服务 “GetApplicationQueryValidator.”

查询、验证程序和响应类如下所示:

public class GetApplicationQuery : IRequest<Response>
{
    private string _name;
    public GetApplicationQuery(string name)
    {
        _name = name;
    }

    public string Name { get { return _name; } }
}

public class GetApplicationQueryHandler : IRequestHandler<GetApplicationQuery, Response>
{

    public GetApplicationQueryHandler() { }

    public async Task<Response> Handle(GetApplicationQuery request, CancellationToken cancellationToken)
    {
        return new Response("yadda yadda");            
    }
}

public class GetApplicationQueryValidator : AbstractValidator<GetApplicationQuery>
{
    public GetApplicationQueryValidator(GetApplicationQuery request)
    {   
        RuleFor(m => m.Name).MinimumLength(30).WithMessage("Name must be greater than 30 characters, long");
    }
}

public class Response
{
    private readonly IList<string> _messages = new List<string>();

    public IEnumerable<string> Errors { get; }
    public object Result { get; }

    public Response() => Errors = new ReadOnlyCollection<string>(_messages);

    public Response(object result) : this() => Result = result;

    public Response AddError(string message)
    {
        _messages.Add(message);
        return this;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    AddMediatr(services);
    services.AddMvc().AddFluentValidation(fv => 
        {
            fv.RegisterValidatorsFromAssemblyContaining<Startup>();
            fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);           
}

private static void AddMediatr(IServiceCollection services)
{
    const string applicationAssemblyName = "ApplicationApi";
    var assembly = AppDomain.CurrentDomain.Load(applicationAssemblyName);

    AssemblyScanner
        .FindValidatorsInAssembly(assembly)
        .ForEach(result => services.AddScoped(result.InterfaceType, result.ValidatorType));

    services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ValidatorHandler<,>));

    services.AddMediatR(assembly);


}
我在Startup类中的配置如下所示:

public class GetApplicationQuery : IRequest<Response>
{
    private string _name;
    public GetApplicationQuery(string name)
    {
        _name = name;
    }

    public string Name { get { return _name; } }
}

public class GetApplicationQueryHandler : IRequestHandler<GetApplicationQuery, Response>
{

    public GetApplicationQueryHandler() { }

    public async Task<Response> Handle(GetApplicationQuery request, CancellationToken cancellationToken)
    {
        return new Response("yadda yadda");            
    }
}

public class GetApplicationQueryValidator : AbstractValidator<GetApplicationQuery>
{
    public GetApplicationQueryValidator(GetApplicationQuery request)
    {   
        RuleFor(m => m.Name).MinimumLength(30).WithMessage("Name must be greater than 30 characters, long");
    }
}

public class Response
{
    private readonly IList<string> _messages = new List<string>();

    public IEnumerable<string> Errors { get; }
    public object Result { get; }

    public Response() => Errors = new ReadOnlyCollection<string>(_messages);

    public Response(object result) : this() => Result = result;

    public Response AddError(string message)
    {
        _messages.Add(message);
        return this;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    AddMediatr(services);
    services.AddMvc().AddFluentValidation(fv => 
        {
            fv.RegisterValidatorsFromAssemblyContaining<Startup>();
            fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);           
}

private static void AddMediatr(IServiceCollection services)
{
    const string applicationAssemblyName = "ApplicationApi";
    var assembly = AppDomain.CurrentDomain.Load(applicationAssemblyName);

    AssemblyScanner
        .FindValidatorsInAssembly(assembly)
        .ForEach(result => services.AddScoped(result.InterfaceType, result.ValidatorType));

    services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ValidatorHandler<,>));

    services.AddMediatR(assembly);


}
我猜我的配置是错误的,但我已经多次更改配置,但都没有成功

任何指导都将不胜感激

GetApplicationQueryValidator将GetApplicationQuery作为构造函数依赖项,但集合不知道如何注入它

也没有看到如何在验证器中使用它。我建议从构造函数中删除GetApplicationQuery,因为它看起来不是必需的

public class GetApplicationQueryValidator : AbstractValidator<GetApplicationQuery> {
    public GetApplicationQueryValidator() { 
        RuleFor(m => m.Name).MinimumLength(30).WithMessage("Name must be greater than 30 characters, long");
    }
}

在何处将GetApplicationQuery添加到服务集合?GetApplicationQueryValidator将其作为构造函数依赖项,但集合不知道该依赖项,因此无法将其注入。也没有看到它是如何使用的。这解决了问题。然后,我让验证器启动了两次,并意识到我不需要ConfigureServices中的AddFluentValidation调用