无法从根提供者解析作用域服务. ASP.NET MVC应用程序App [英] Cannot resolve scoped service from root provider. ASP.NET MVC app App

查看:57
本文介绍了无法从根提供者解析作用域服务. ASP.NET MVC应用程序App的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Adam Freeman的Pro ASP.NET Core MVC 6th Edition做商店应用程序.书中的示例是在Core 1.0中制作的,而我正在使用Core 3.0.尝试将数据播种到数据库(entityFramework)时,出现以下错误.

I am doing Store application with Pro ASP.NET Core MVC 6th Edition by Adam Freeman. The example in book is made in Core 1.0, and I am using Core 3.0. I get error as below, while trying to seed data to my database (entityFramework).

System.InvalidOperationException:'无法解析作用域服务 根提供商提供的"BookStore.Models.ApplicationDbContext".

System.InvalidOperationException: 'Cannot resolve scoped service 'BookStore.Models.ApplicationDbContext' from root provider.'

下面是我的代码:

 public class SeedData
    {
        public static void EnsurePopulated(IApplicationBuilder app)
        {
            ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
            if (!context.Products.Any())
            {
                context.Products.AddRange(
                    new Product {
                        Name = "Witcher",
                        Description = "Geralt the Witcher",
                        Category = "Fantasy",
                        Price = 30 }
                    );
                context.SaveChanges();
            }
        }

启动类:

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
    {
        Configuration = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json").Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:BookStoreProducts:ConnectionString"]));
        services.AddTransient<IProductRepository, EFProductRepository>();
        services.AddControllersWithViews();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Product}/{action=List}/{id?}");
        });
        SeedData.EnsurePopulated(app);
    }
}

和Program.cs

And Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

我在依赖注入方面还比较陌生,因此可以对发生的情况进行一些解释.我在网上搜索答案超过两个小时,没有任何结果.

I am rather new in dependency injection so some explanation what is happening would be nice. I am searchin answer online for more than two hours without any result.

有关错误的更多信息:

在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType,IServiceScope范围,IServiceScope rootScope)位于 Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(Type serviceType,IServiceScope范围),位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType,ServiceProviderEngineScope serviceProviderEngineScope)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,键入serviceType),位于 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](IServiceProvider 供应商) BookStore.Models.SeedData.EnsurePopulated(IApplicationBuilder app)在 C:\ Users \ Piotr \ source \ repos \ Store \ BookStore \ Models \ SeedData.cs:第12行 在BookStore.Startup.Configure(IApplicationBuilder应用, IWebHostEnvironment env,ILoggerFactory loggerFactory, ApplicationDbContext上下文)中 C:\ Users \ Piotr \ source \ repos \ Store \ BookStore \ Startup.cs:第51行位于 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[] 参数,签名sig,布尔构造函数,布尔wrapExceptions) 在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,活页夹活页夹,Object []参数,CultureInfo文化)
在Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object 例如IApplicationBuilder构建器) Microsoft.AspNetCore.Hosting.ConfigureBuilder.<> c__DisplayClass4_0.b__0(IApplicationBuilder 建造者) Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<> c__DisplayClass13_0.b__2(IApplicationBuilder 应用程式) Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<> c__DisplayClass0_0.g__MiddlewareFilterBuilder | 0(IApplicationBuilder 建造者) Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter.<> c__DisplayClass2_0.b__0(IApplicationBuilder 应用程式) Microsoft.AspNetCore.HostFilteringStartupFilter.<> c__DisplayClass0_0.b__0(IApplicationBuilder 应用程式) Microsoft.AspNetCore.Hosting.GenericWebHostService.d__31.MoveNext()

at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(Type serviceType, IServiceScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at BookStore.Models.SeedData.EnsurePopulated(IApplicationBuilder app) in C:\Users\Piotr\source\repos\Store\BookStore\Models\SeedData.cs:line 12 at BookStore.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context) in C:\Users\Piotr\source\repos\Store\BookStore\Startup.cs:line 51 at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__2(IApplicationBuilder app) at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) at Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter.<>c__DisplayClass2_0.b__0(IApplicationBuilder app) at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) at Microsoft.AspNetCore.Hosting.GenericWebHostService.d__31.MoveNext()

因此解决方案是:

var scopeeee = app.ApplicationServices.CreateScope();

ApplicationDbContext context = scopeeee.ServiceProvider.GetRequiredService<ApplicationDbContext>();

在确保方法的开头添加.谢谢!

Added at the beggining of EnsurePopulated method. Thanks!

推荐答案

您需要在EnsurePopulated方法中创建范围,然后从该范围中获取实例.

You need to create scope in EnsurePopulated method and then get instance from this scope.

这篇关于无法从根提供者解析作用域服务. ASP.NET MVC应用程序App的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆