Внедрение зависимостей в ASP.Net Core - PullRequest
0 голосов
/ 18 сентября 2018

Я делал некоторый пример кода с ASP.NET Core, чтобы попытаться понять, как он совмещается, и я озадачен, почему я не могу успешно разрешить службу.

Метод настройки служб имеет вызовдобавить ISeedDataService

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddDbContext<CustomerDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddScoped<ICustomerDbContext, CustomerDbContext>();
    services.AddScoped<ICustomerRepository, CustomerRepository>();
    services.AddScoped<ISeedDataService, SeedDataService>();
}

В Configure я вызываю AddSeedData (), как показано ниже

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.AddSeedData();
}

, который вызывает метод расширения ниже

public static async void AddSeedData(this IApplicationBuilder app)
{
    var seedDataService = app.ApplicationServices.GetRequiredService<ISeedDataService>();
    await seedDataService.EnsureSeedData();
}

и SeedDataServiceниже

public class SeedDataService : ISeedDataService
{
    private ICustomerDbContext _context;
    public SeedDataService(ICustomerDbContext context)
    {
        _context = context;
    }

    public async Task EnsureSeedData()
    {
        _context.Database.EnsureCreated();

        _context.Customers.RemoveRange(_context.Customers);
        _context.SaveChanges();

        Customer customer = new Customer();
        customer.FirstName = "Chuck";
        customer.LastName = "Norris";
        customer.Age = 30;
        customer.Id = Guid.NewGuid();

        _context.Add(customer);

        Customer customer2 = new Customer();
        customer2.FirstName = "Fabian";
        customer2.LastName = "Gosebrink";
        customer2.Age = 31;
        customer2.Id = Guid.NewGuid();

        _context.Add(customer2);

        await _context.SaveChangesAsync();
    }
}

Совершенно неуверен в том, что я делаю неправильно, ошибка: System.InvalidOperationException: «Не удается разрешить службу с ограничениями» secondapp.Services.ISeedDataService 'от корневого поставщика.'

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Метод Configure() позволяет вводить зависимости параметров, поэтому вы можете сделать следующее.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ISeedDataService seedService)
{
    seedService.EnsureSeedData().Wait(); // Configure() is not async so you have to wait
}
0 голосов
/ 18 сентября 2018

Вы (и должны быть) добавляете ISeedDataService в качестве сервиса с областью действия.Однако вы пытаетесь разрешить его у корневого поставщика (например, app.ApplicationServices), который не ограничен.Это означает, что сервисы с областью действия, разрешенные из него, эффективно превращаются в одноэлементный сервис и не удаляются до тех пор, пока приложение не закроется или не произойдет ошибка.

Решение здесь заключается в том, чтобы создать область самостоятельно:

public void Configure(IApplicationBuilder app)
{
    using (var scope = app.ApplicationServices.CreateScope())
    {
        var seedDataService = scope.ServiceProvider.GetRequiredService<ISeedDataService>();
        // Use seedDataService here
    }
}

Пожалуйста, ознакомьтесь с документацией относительно областей внедрения зависимостей.


С другой стороны: ваш AddSeedData метод расширения равен async void иВы не ждете результата.Вы должны вернуть вызов задачи (async Task) AddSeedData().GetAwaiter().GetResult(), чтобы убедиться, что вы блокируете до завершения заполнения.

...