升级到 Core 2 Preview 2 后出现“无法解析类型的服务 ..”
Posted
技术标签:
【中文标题】升级到 Core 2 Preview 2 后出现“无法解析类型的服务 ..”【英文标题】:Getting "Could not resolve a service of type .." after upgrading to Core 2 Preview 2 【发布时间】:2018-01-13 13:21:51 【问题描述】:我刚刚升级到 ASP.NET Core 2 Preview 2,遇到了依赖注入问题。我明白了
无法解析服务类型 'LC.Tools.API.Data.GenericDbContext' 用于参数 'context' “LC.Tools.API.Startup”类型上的“配置”方法 运行项目时。
我使用旧版本时没有这个问题。
DbContext(通用DbContext):
namespace LC.Tools.API.Data
public class GenericDbContext : DbContext
public GenericDbContext(DbContextOptions<GenericDbContext> options) : base(options)
protected override void OnModelCreating(ModelBuilder builder)
//Generic
builder.Entity<Client>();
builder.Entity<Graphic>();
.
.
.
.
.
//Shop
builder.Entity<Models.Shop.Store>().ToTable("ShopClient");
builder.Entity<Models.Shop.Category>().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<Data.GenericDbContext>(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) 异常:不能 为 '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(类型 服务类型,服务提供者服务提供者) Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 服务类型) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,类型 serviceType) Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(对象 例如,IApplicationBuilder 构建器)
【问题讨论】:
看看这是否有帮助***.com/questions/44180773/… 您正在尝试将上下文注入到Configure
方法中,但该方法不起作用。从Configure
方法中移除注入的上下文,而是注入服务提供者并尝试在方法中解析上下文。
我还想知道自从它在 asp.net core 1 中工作以来,上一个版本发生了什么变化。我只是认为自定义实现不需要它,因为它工作正常照原样。
如链接答案中所述,现在只有某些服务在启动时可用。
【参考方案1】:
您正在尝试将上下文注入到 Configure
方法中,但该方法不起作用。从Configure
方法中移除注入的上下文,而是注入服务提供者并尝试在方法中解析上下文。
public IServiceProvider ConfigureServices(IServiceCollection services)
services.AddOptions();
services.AddDbContext<Data.GenericDbContext>(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.GenericDbContext>();
Data.Debug.Init.Initalize(context, env);
【讨论】:
您实际上可以在ConfigureServices
方法中完成所有操作,而不是注入到 Configure
中,但这是您的选择。
您不需要构建服务提供者。我不确定你为什么要这么做。【参考方案2】:
@Nkosi 的回答让我走上了正确的道路,但您实际上并不需要那么多步骤,至少在 2.0 及更高版本中:
public void ConfigureServices(IServiceCollection services)
services.AddOptions();
services.AddDbContext<Data.GenericDbContext>(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.GenericDbContext>();
Data.Debug.Init.Initalize(context, env);
您无需从ConfigureServices
返回任何内容或在我正在运行的版本(2.0)中构建中间提供程序
【讨论】:
以上是关于升级到 Core 2 Preview 2 后出现“无法解析类型的服务 ..”的主要内容,如果未能解决你的问题,请参考以下文章
从 dotnet Core 2.2.6 更改为 3.0.0 后出现 EF Linq 错误
IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏