我正在使用Fluent Validation 8验证模型。
我希望能够从Validator类中的appsettings.json中读取内容,但是未注入配置。
这是我的验证人:
public class CreateOperationRequestValidator: AbstractValidator<OperationInputModel>
{
private IConfiguration Configuration { get; set; }
public CreateOperationRequestValidator(IConfiguration configuration)
{
CascadeMode = CascadeMode.StopOnFirstFailure;
RuleFor(m => m.mode).NotEmpty().IsInEnum();
;
}
但是我的配置为空。
我的创业公司是:
services.AddSingleton<IConfiguration>(Configuration);
services.AddMvc(opt =>
{
opt.Filters.Add(typeof(ValidatorActionFilter));
}).AddFluentValidation(
fvc => fvc.RegisterValidatorsFromAssemblyContaining<Startup>()
);
答案 0 :(得分:0)
为了注入类,这些类本身必须在服务集合中注册。 Fluent Validation很有可能不是 这样做的结果,因此您无能为力。换句话说,您在这里受到库本身的摆布,以及它如何在内部处理对象实例化和生存期。
同样值得一提的是,属性不能被注入,因为它们本质上是被实例化的。通常,这是属性的限制,而不仅仅是Microsoft.Extensions.DependencyInjection
。我不确定您是否将过滤器用作属性,但很有可能Fluent Validation在这里不支持注入,仅仅是因为根据使用情况,注入不一致。
答案 1 :(得分:0)
您可以执行以下操作
使用所需的属性创建ConfigSettings模式类
public class ConfigSettings
{
// get and set your setting properties here
}
然后使用Microsoft.Extensions.Options在验证器构造函数参数中传递以下类似设置
public class CreateOperationRequestValidator: AbstractValidator<OperationInputModel>
{
public CreateOperationRequestValidator(IOptions<ConfigSettings> settings)
{
CascadeMode = CascadeMode.StopOnFirstFailure;
RuleFor(m => m.mode).NotEmpty().IsInEnum();
;
}
}
您可以通过settings.Value来访问属性。{您的属性名称}
最后在Startup.cs中添加以下行
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<ConfigSettings>(Configuration);
services.Add(ServiceDescriptor.Transient(typeof(ConfigSettings), typeof(ConfigSettings)));
}