繁体   English   中英

无法从根提供程序解析范围服务。 ASP.NET MVC 应用程序

[英]Cannot resolve scoped service from root provider. ASP.NET MVC app App

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

System.InvalidOperationException: '无法从根提供程序解析范围服务 'BookStore.Models.ApplicationDbContext'。

下面是我的代码:

 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

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

我在依赖注入方面比较新,所以对正在发生的事情进行一些解释会很好。 我在网上搜索了两个多小时的答案,没有任何结果。

以及更多关于错误的信息:

在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve, IServiceScope rootScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceProvider[T](T)在 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 上下文)在 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 ) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo 文化)
在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) 在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__2( IApplicationBuilder 应用程序)在 Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)在 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()

所以解决方案是:

var scopeeee = app.ApplicationServices.CreateScope();

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

在EnsurePopulated 方法开始时添加。 谢谢!

您需要在EnsurePopulated方法中创建作用域,然后从该作用域中获取实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM