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
相关产品推荐
相关产品推荐

