我正在尝试获取DbContext的实例(因此我可以在启动时执行一些额外的工作),尝试在Configure方法中获取实例时出现以下错误:
System.InvalidOperationException:'无法从根提供程序解析作用域服务'MyApp.Data.MyDbContext'.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(
options => options.UseSqlServer(Configuration.GetConnectionString("MyDbContext")));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var dbContext = app.ApplicationServices.GetService(typeof(MyDbContext)) as MyDbContext;
}
Run Code Online (Sandbox Code Playgroud)
我可以通过控制器等访问DbContext的实例
它已被充分记录,如何将依赖项注入服务.
问题:但是在ASP.NET Core 2.0中是否(已经)可以让系统的DI机制自动将服务注入方法或属性?
旁注:在PHP-Symfony中,这种模式称为setter injection.
示例:
假设MyBaseController我的项目中的所有控制器都有一个公共类,我希望注入一个服务(例如UserManager服务),MyBaseController以后可以在所有子控制器中访问.我可以使用构造函数注入将服务注入子类并将其传递base(userManager)给父类.但是必须在所有控制器的所有子构造器中执行此操作非常繁琐.
所以我想像这样设置一个setter MyBaseController:
public abstract class MyBaseController : Controller
{
public UserManager<User> userManager { get; set; }
// system should auto inject UserManager here
public void setUserManager(UserManager<User> userManager) {
this.userManager = userManager;
}
}
Run Code Online (Sandbox Code Playgroud)
...所以我不必在每个子构造函数中执行以下操作只是为了将依赖项传递给父级:
public class UsersController : MyBaseController
{
public ChildController(UserManager<User> userManager) : base(userManager) {}
Run Code Online (Sandbox Code Playgroud)
更新:这里给出的答案是我想要实现的,但问题是ASP.NET Core 1.0,我对ASP.NET Core 2.0中是否添加了任何解决方案感兴趣.
c# dependency-injection asp.net-core-2.0 asp.net-core-mvc-2.0
什么是ServiceProviderOptions.ValidateScopes?我觉得我无法完全理解它在引擎盖下的作用.我有一个教程,但没有解释.