本文介绍了得到“无法解析类型为..的服务".升级到Core 2 Preview 2之后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚升级到ASP.NET Core 2 Preview 2,并遇到了去污剂注入问题.我知道了

I've just upgraded to ASP.NET Core 2 Preview 2 and ran into a problem with the depedency injection. I get

使用旧版本时我没有这个问题.

I didn't have this problem when using the old version.

DbContext(GenericDbContext):

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".

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

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType,ServiceProvider serviceProvider)异常:无法 解决类型为"LC.Tools.API.Data.GenericDbContext"的服务 类型上的方法配置"的参数上下文" "LC.Tools.API.Startup".

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, ServiceProvider serviceProvider) Exception: Could not resolve a service of type 'LC.Tools.API.Data.GenericDbContext' for the parameter 'context' of method 'Configure' on type 'LC.Tools.API.Startup'.

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

Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(object instance, IApplicationBuilder builder)

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

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType,ServiceProvider serviceProvider) Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type 服务类型) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,输入serviceType) Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(对象 实例,即IApplicationBuilder构建器)

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type 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(object instance, IApplicationBuilder builder)

推荐答案

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

You are trying to inject the context into the Configure method which wont work. Remove the injected context from the Configure method and instead inject the service provider and try to resolve the context within the method.

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);
}

这篇关于得到“无法解析类型为..的服务".升级到Core 2 Preview 2之后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-09 23:20