Saya sedang mengerjakan aplikasi ASP.NET Core 3.1. Saya ingin melakukan beberapa tindakan terakhir yang terkait dengan database saat aplikasi saya akan berhenti. Untuk melakukan itu saya mencoba memanggil fungsi dalam layanan cakupan saya yang merupakan lapisan tambahan antara database dan ASP.NET Core.

Startup.cs

public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
{
    lifetime.ApplicationStopping.Register(() =>
    {
        app.ApplicationServices.GetService<MyService>().SynchronizeChanges();
    });
}

Tapi sayangnya saya mendapatkan kesalahan Cannot resolve scoped service 'MyApplication.Services.MyService' from root provider saat saya mencoba melakukannya.

7
Nazar Antonyk 7 Maret 2020, 19:05

1 menjawab

Jawaban Terbaik

Tidak ada ruang lingkup saat aplikasi ditutup, jadi inti Asp.Net tidak dapat membuat layanan cakupan. Lingkup dibuat selama permintaan http saja. Jika Anda perlu membuat layanan cakupan tanpa cakupan, Anda dapat membuat cakupan secara manual:

public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
{
    lifetime.ApplicationStopping.Register(() =>
    {
        using (var scope = app.ApplicationServices.CreateScope())
        {
            scope.ServiceProvider
              .GetRequiredService<MyService>().SynchronizeChanges();
        }
    });
}

Anda juga mungkin dapat mendaftarkan layanan Anda sebagai singleton atau mencoba menonaktifkan validasi cakupan Asp.Net Core (tidak disarankan).

3
ingvar 7 Maret 2020, 17:04