升级到Core 2 Preview 2

时间:2017-08-05 21:23:41

标签: c# .net entity-framework asp.net-core asp.net-core-2.0

我刚刚升级到ASP.NET Core 2 Preview 2并遇到了依赖注入的问题。我得到了

  

无法解析类型的服务   'LC.Tools.API.Data.GenericDbContext'用于参数'context'   类型'LC.Tools.API.Startup'上的'配置'方法   在运行项目时。

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

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:无法解析作用域服务   来自root provider的'LC.Tools.API.Data.GenericDbContext'。

     

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(类型   serviceType,ServiceProvider serviceProvider)例外:无法   为...解析'LC.Tools.API.Data.GenericDbContext'类型的服务   类型的方法'Configure'的参数'context'   '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(类型   服务类型)       Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(的IServiceProvider   提供者,类型serviceType)       Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(对象   实例,IApplicationBuilder构建器)

2 个答案:

答案 0 :(得分:3)

您正在尝试将上下文注入到无效的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);
}

答案 1 :(得分:1)

@ 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)