Не удается разрешить услугу в пределах области от поставщика root. ASP. NET MVC app App - PullRequest
1 голос
/ 25 января 2020

Я делаю приложение Store с Pro ASP. NET Core MVC 6th Edition от Адама Фримена. Пример в книге сделан в Core 1.0, и я использую Core 3.0. Я получаю сообщение об ошибке, как показано ниже, при попытке заполнить данные в моей базе данных (entityFramework).

System.InvalidOperationException: «Не удается разрешить сервисную область» BookStore.Models.ApplicationDbContext от поставщика root.

Ниже мой код:

 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 (Тип serviceType , Область IServiceScope, IServiceScope rootScope) по адресу Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve (тип serviceType, IServiceService.Service.Service.Serp.InerSignerSpeSignSignSpecSignSignSenSignSignSenSignExSecence_Exence.Exence.ExSenseSec serviceProviderEngineScope serviceProviderEngineScope)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService (тип ServiceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, тип ServiceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServ ice [T] (поставщик IServiceProvider) в BookStore.Models.SeedData.EnsurePopulated (приложение IApplicationBuilder) в 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.InvokeMetho (объектный объект объекта (Object Object Object, InvokeMetho) [] аргументы, сигнатура sig, логический конструктор, логическое wrapExceptions) в System.Reflection.RuntimeMethodInfo.Invoke (объектный объект, BindingFlags invokeAttr, связыватель Binder, параметры Object [], CultureInfo culture)
в Microsoft.AspNetCore.Hosting.Configure .Invoke (Экземпляр объекта, построитель IApplicationBuilder) в Microsoft.AspNetCore.Hosting.ConfigureBuilder. <> C__DisplayClass4_0.b__0 (построитель IApplicationBuilder) в Microsoft.AspNetCore.Hosting.GenericWebHostBuilder. <0 oft.AspNetCore. Mvc .Filters.MiddlewareFilterBuilderStartupFilter. <> c__DisplayClass0_0.g__MiddlewareFilterBuilder | 0 (сборщик IApplicationBuilder) в Microsoft.AspNetCore.Server.Ier.IIS. HostFilteringStartupFilter. <> C__DisplayClass0_0.b__0 (приложение IApplicationBuilder) в Microsoft.AspNetCore.Hosting.GenericWebHostService.d__31.MoveNext ()

Так что решение было добавлено:

1028
var scopeeee = app.ApplicationServices.CreateScope();

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

начало метода EnsurePopulated. Спасибо!

1 Ответ

1 голос
/ 25 января 2020

Вам необходимо создать область действия в методе EnsurePopulated, а затем получить экземпляр из этой области действия.

...