You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server项目中如何为FluentValidation的AbstractValidator注入依赖

解决Blazor Server中FluentValidator依赖注入问题

问题原因

报错提示需要无参构造函数,是因为默认情况下FluentValidation会尝试通过无参构造实例化验证器,而你的StockValidator依赖了StockOverviewService,无法直接创建实例。

正确实现步骤

1. 注册服务到DI容器

在项目的Program.cs中,将验证器和依赖的服务都注册到依赖注入容器:

// 注册数据库服务
builder.Services.AddScoped<StockOverviewService>();
// 注册验证器,同时关联泛型验证器接口
builder.Services.AddScoped<IValidator<LagertypModel>, StockValidator>();
// 启用FluentValidation的自动验证和客户端适配器
builder.Services.AddFluentValidationAutoValidation().AddFluentValidationClientsideAdapters();

2. 优化验证器代码(修复异步调用问题)

你当前用.Result同步等待异步方法,容易导致Blazor Server死锁,建议改用MustAsync异步验证:

public class StockValidator : AbstractValidator<LagertypModel>
{
    private readonly StockOverviewService _stockService;

    public StockValidator(StockOverviewService stockService)
    {
        _stockService = stockService;

        RuleFor(model => model.Lagertyp)
            .NotEmpty()
            .MaximumLength(4)
            .MustAsync(async (lagertyp, cancellationToken) => 
                await _stockService.validateStockTypeCU(lagertyp));
    }
}

3. 组件中使用验证

在Blazor组件的EditForm中,不需要手动实例化验证器,配置了自动验证后,框架会自动从DI容器获取对应的IValidator<LagertypModel>实例进行验证:

<EditForm Model="@lagertypModel" OnValidSubmit="@HandleValidSubmit">
    <DataAnnotationsValidator />
    <!-- 显示验证错误 -->
    <ValidationMessage For="@(() => lagertypModel.Lagertyp)" />
    
    <!-- 表单内容 -->
    <InputText @bind-Value="@lagertypModel.Lagertyp" />
    <button type="submit">提交</button>
</EditForm>

@code {
    private LagertypModel lagertypModel = new();

    private async Task HandleValidSubmit()
    {
        // 处理提交逻辑
    }
}

内容的提问来源于stack exchange,提问作者Holistiker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:31:06