升级到Core 2 Preview 2后获取“无法解析类型的服务..”

我刚刚升级到ASP.NET Core 2 Preview 2并遇到了dependency injection的问题。 我明白了

在运行项目时,无法为类型为“LC.Tools.API.Startup”的方法“Configure”的参数“context”解析类型为“LC.Tools.API.Data.GenericDbContext”的服务。

使用旧版本时我没有遇到此问题。

DbContext(GenericDbContext):

namespace LC.Tools.API.Data { public class GenericDbContext : DbContext { public GenericDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { //Generic builder.Entity(); builder.Entity(); . . . . . //Shop builder.Entity().ToTable("ShopClient"); builder.Entity().ToTable("ShopCategory"); . . . . . . } } 

Startup.cs:

 namespace LC.Tools.API { public class Startup { public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); this.HostingEnvironment = env; } public void ConfigureServices(IServiceCollection services) { services.AddOptions(); services.AddDbContext(options => options.UseSqlServer(this.ConnectionString)); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, Data.GenericDbContext context) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor, ForwardLimit = 2 }); app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } app.UseStaticFiles(); app.UseMvc(); Data.Debug.Init.Initalize(context, env); } private IHostingEnvironment HostingEnvironment { get; set; } public IConfigurationRoot Configuration { get; } private string ConnectionString { get { return this.HostingEnvironment.IsDevelopment() ? Configuration.GetConnectionString("Development") : Configuration.GetConnectionString("Production"); } } } } 

例外:

启动应用程序时发生错误。

InvalidOperationException:无法从根提供程序解析作用域服务“LC.Tools.API.Data.GenericDbContext”。

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型serviceType,ServiceProvider serviceProvider)exception:无法为方法“Configure”的参数“context”解析类型为“LC.Tools.API.Data.GenericDbContext”的服务输入’LC.Tools.API.Startup’。

Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder构建器)

 InvalidOperationException: Cannot resolve scoped service 'LC.Tools.API.Data.GenericDbContext' from root provider. 

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型serviceType,ServiceProvider serviceProvider)Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider,Type serviceType)Microsoft.AspNetCore .Hosting.Internal.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder构建器)

您正在尝试将上下文注入到无法正常工作的Configure方法中。 从Configure方法中删除注入的上下文,而是注入服务提供者并尝试解析方法中的上下文。

 public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddOptions(); services.AddDbContext(options => options.UseSqlServer(this.ConnectionString)); services.AddMvc(); // Build the intermediate service provider var serviceProvider = services.BuildServiceProvider(); //return the provider return serviceProvider; } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { //...Other code removed for brevity var context = serviceProvider.GetService(); Data.Debug.Init.Initalize(context, env); } 

@ Nkosi的回答让我走上正轨但你实际上并不需要那么多步骤,至少在2.0及以上版本中:

 public void ConfigureServices(IServiceCollection services) { services.AddOptions(); services.AddDbContext(options => options.UseSqlServer(this.ConnectionString)); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { //...Other code removed for brevity var context = serviceProvider.GetService(); Data.Debug.Init.Initalize(context, env); } 

您不需要从ConfigureServices返回任何内容或在我正在运行的版本中构建中间提供程序(2.0)