【发布时间】:2019-10-06 19:14:00
【问题描述】:
sigh startup.cs 中的这一行:
services.AddScoped<IServiceProvider, ServiceProvider>();
破坏我的应用程序,无法调试,在说构建成功后停止。没有错误。没有例外。如果我注释掉这一行,一切都会再次运行,并且应用程序会运行。
为什么会这样?我想注入 IServiceProvider 的原因是因为它是 ActivatorUtilities 所必需的,我在 BaseController 中使用它来简化这样的验证:
public MyController(IServiceProvider serviceProvider) : base(serviceProvider) { }
[HttpPost]
public ActionResult Post(MyViewModel viewModel)
{
ValidateFor<MyValidator>(viewModel);
if (!IsValid)
{
... error stuff
}
return Ok("Success!");
}
在 BaseController 中
protected IserviceProvider ServiceProvider { get; set; }
public BaseController(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public void ValidateFor<TValidator>(object instance) where TValidator : IValidator
{
// injected ServiceProvider here as a protected property of the base controller
var validator = ActivatorUtilities.CreateInstance<TValidator>(ServiceProvider);
var result = validator.Validate(instance);
if (result.IsValid)
{
return;
}
... process errors
}
解决方案
解决方案是在控制器的上下文中以正确的方式使用IServiceProvider。
所以而不是:
var validator = ActivatorUtilities.CreateInstance<TValidator>(ServiceProvider);
完全摆脱控制器中的依赖并改用它:
var validator = HttpContext.RequestServces.GetService<TValidator>();
【问题讨论】:
-
你看日志了吗?
-
这可能是XY problem。
标签: c# asp.net-core dependency-injection asp.net-core-3.0