C# Asp.net 3.0 IServiceProvider无法注入
在startup.cs中签下这一行:C# Asp.net 3.0 IServiceProvider无法注入,c#,asp.net-core,dependency-injection,asp.net-core-3.0,C#,Asp.net Core,Dependency Injection,Asp.net Core 3.0,在startup.cs中签下这一行: services.AddScoped<IServiceProvider, ServiceProvider>(); 完全摆脱控制器中的依赖关系,改用此选项: var validator = HttpContext.RequestServces.GetService<TValidator>(); var validator=HttpContext.requestservics.GetService(); 这可能是一个错误 无需注入服务
services.AddScoped<IServiceProvider, ServiceProvider>();
完全摆脱控制器中的依赖关系,改用此选项:
var validator = HttpContext.RequestServces.GetService<TValidator>();
var validator=HttpContext.requestservics.GetService();
这可能是一个错误
无需注入服务提供者,因为对于当前请求,可以通过控制器的HttpContext
访问服务提供者
public BaseController() {
}
public void ValidateFor<TValidator>(object instance) where TValidator : IValidator {
// Access the service provider via the current request
var validator = HttpContext.RequestServces.GetService<TValidator>();
var result = validator.Validate(instance);
if (result.IsValid) {
return;
}
//... process errors
}
其中,可以相应地重构基本验证
protected void ValidateFor<TValidator>(TValidator validator, object instance)
where TValidator : IValidator {
var result = validator.Validate(instance);
if (result.IsValid) {
return;
}
//... process errors
}
受保护的void ValidateFor(TValidator验证器,对象实例)
其中TValidator:IValidator{
var result=validator.Validate(实例);
if(result.IsValid){
返回;
}
//…进程错误
}
参考资料你看过日志了吗?这可能是一个。很好用。在以前的asp.net core 2.0项目中,以前的范例正在运行。然而,这种将验证器直接注入控制器方法的模式也很好代码>看起来确实更干净。
[HttpPost]
public ActionResult Post(MyViewModel viewModel, [FromServices] MyValidator validator) {
ValidateFor(validator, viewModel);
if (!IsValid) {
//... error stuff
}
return Ok("Success!");
}
protected void ValidateFor<TValidator>(TValidator validator, object instance)
where TValidator : IValidator {
var result = validator.Validate(instance);
if (result.IsValid) {
return;
}
//... process errors
}