升级到 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 后出现“无法解析类型的服务 ..”的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 3 预览版:不允许同步操作

从 dotnet Core 2.2.6 更改为 3.0.0 后出现 EF Linq 错误

.NET Core 2.0 Preview2 发布汇总

IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏

HTTP 错误 502.5 - 升级到 ASP.NET Core 2.2 后 ANCM 进程外启动失败

Unity4升级Unity5后Image Effects问题