Startup aplikasi di ASP.NET Core

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Oleh Rick Anderson

Aplikasi ASP.NET Core yang dibuat dengan template web berisi kode pengaktifan aplikasi dalam file Program.cs.

Kode startup aplikasi berikut mendukung:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Aplikasi yang menggunakan EventSource dapat mengukur waktu startup untuk memahami dan mengoptimalkan performa startup. Peristiwa ServerReady di Microsoft.AspNetCore.Hosting mewakili titik di mana server siap merespons permintaan.

Untuk informasi selengkapnya tentang pengaktifan aplikasi, lihat gambaran umum dasar-dasar ASP.NET Core.

Perluas Startup dengan filter startup

Gunakan IStartupFilter:

  • Untuk mengonfigurasi middleware di awal atau akhir alur middleware aplikasi tanpa panggilan eksplisit ke Use{Middleware}. Gunakan IStartupFilter untuk menambahkan default ke awal alur tanpa secara eksplisit mendaftarkan middleware default. IStartupFilter memungkinkan komponen yang berbeda untuk memanggil Use{Middleware} atas nama penulis aplikasi.
  • Untuk membuat alur Configure metode. IStartupFilter.Configure dapat mengatur middleware untuk dijalankan sebelum atau sesudah middleware ditambahkan oleh pustaka.

IStartupFilterConfiguremengimplementasikan , yang menerima dan mengembalikan Action<IApplicationBuilder>. Menentukan IApplicationBuilder kelas untuk mengonfigurasi alur permintaan aplikasi. Untuk informasi selengkapnya, lihat Membuat alur middleware dengan IApplicationBuilder.

Masing-masing IStartupFilter dapat menambahkan satu atau beberapa middleware dalam alur permintaan. Filter dipanggil dalam urutan ditambahkan ke kontainer layanan. Filter dapat menambahkan middleware sebelum atau sesudah meneruskan kontrol ke filter berikutnya, sehingga ditambahkan ke awal atau akhir alur aplikasi.

Contoh berikut menunjukkan cara mendaftarkan middleware dengan IStartupFilter. Middleware RequestSetOptionsMiddleware menetapkan nilai opsi dari parameter string kueri:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

dikonfigurasi RequestSetOptionsMiddleware di RequestSetOptionsStartupFilter kelas :

namespace WebStartup.Middleware;
// <snippet1>
public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}
// </snippet1>

IStartupFilter terdaftar di Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Saat parameter string kueri untuk option disediakan, middleware memproses penetapan nilai sebelum middleware ASP.NET Core merender respons:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Urutan eksekusi middleware ditetapkan oleh urutan IStartupFilter pendaftaran:

  • Beberapa IStartupFilter implementasi dapat berinteraksi dengan objek yang sama. Jika pemesanan penting, pesan pendaftaran layanan mereka IStartupFilter agar sesuai dengan urutan yang harus dijalankan middleware mereka.

  • Pustaka dapat menambahkan middleware dengan satu atau beberapa IStartupFilter implementasi yang berjalan sebelum atau sesudah middleware aplikasi lain yang terdaftar dengan IStartupFilter. Untuk memanggil IStartupFilter middleware sebelum middleware ditambahkan oleh pustaka IStartupFilter:

    • Posisikan pendaftaran layanan sebelum pustaka ditambahkan ke kontainer layanan.
    • Untuk memanggil setelahnya, posisikan pendaftaran layanan setelah pustaka ditambahkan.

Catatan: Anda tidak dapat memperluas aplikasi ASP.NET Core saat mengambil alih Configure. Untuk informasi selengkapnya, lihat masalah GitHub ini.

Menambahkan konfigurasi saat startup dari rakitan eksternal

Implementasi IHostingStartup memungkinkan penambahan penyempurnaan ke aplikasi saat startup dari rakitan eksternal di luar file aplikasi Program.cs . Untuk informasi selengkapnya, lihat Menggunakan rakitan startup hosting di ASP.NET Core.

Memulai, MengonfigurasiServices, dan Mengonfigurasi

Untuk informasi tentang menggunakan ConfigureServices metode dan Configure dengan model hosting minimal, lihat:

Aplikasi ASP.NET Core yang dibuat dengan template web berisi kode pengaktifan aplikasi dalam file Program.cs.

Kode startup aplikasi berikut mendukung:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Untuk informasi selengkapnya tentang pengaktifan aplikasi, lihat gambaran umum dasar-dasar ASP.NET Core.

Perluas Startup dengan filter startup

Gunakan IStartupFilter:

  • Untuk mengonfigurasi middleware di awal atau akhir alur middleware aplikasi tanpa panggilan eksplisit ke Use{Middleware}. Gunakan IStartupFilter untuk menambahkan default ke awal alur tanpa secara eksplisit mendaftarkan middleware default. IStartupFilter memungkinkan komponen yang berbeda untuk memanggil Use{Middleware} atas nama penulis aplikasi.
  • Untuk membuat alur Configure metode. IStartupFilter.Configure dapat mengatur middleware untuk dijalankan sebelum atau sesudah middleware ditambahkan oleh pustaka.

IStartupFilterConfiguremengimplementasikan , yang menerima dan mengembalikan Action<IApplicationBuilder>. Menentukan IApplicationBuilder kelas untuk mengonfigurasi alur permintaan aplikasi. Untuk informasi selengkapnya, lihat Membuat alur middleware dengan IApplicationBuilder.

Masing-masing IStartupFilter dapat menambahkan satu atau beberapa middleware dalam alur permintaan. Filter dipanggil dalam urutan ditambahkan ke kontainer layanan. Filter dapat menambahkan middleware sebelum atau sesudah meneruskan kontrol ke filter berikutnya, sehingga ditambahkan ke awal atau akhir alur aplikasi.

Contoh berikut menunjukkan cara mendaftarkan middleware dengan IStartupFilter. Middleware RequestSetOptionsMiddleware menetapkan nilai opsi dari parameter string kueri:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

dikonfigurasi RequestSetOptionsMiddleware di RequestSetOptionsStartupFilter kelas :

namespace WebStartup.Middleware;
// <snippet1>
public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}
// </snippet1>

IStartupFilter terdaftar di Program.cs:

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Saat parameter string kueri untuk option disediakan, middleware memproses penetapan nilai sebelum middleware ASP.NET Core merender respons:

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

Urutan eksekusi middleware ditetapkan oleh urutan IStartupFilter pendaftaran:

  • Beberapa IStartupFilter implementasi dapat berinteraksi dengan objek yang sama. Jika pemesanan penting, pesan pendaftaran layanan mereka IStartupFilter agar sesuai dengan urutan yang harus dijalankan middleware mereka.

  • Pustaka dapat menambahkan middleware dengan satu atau beberapa IStartupFilter implementasi yang berjalan sebelum atau sesudah middleware aplikasi lain yang terdaftar dengan IStartupFilter. Untuk memanggil IStartupFilter middleware sebelum middleware ditambahkan oleh pustaka IStartupFilter:

    • Posisikan pendaftaran layanan sebelum pustaka ditambahkan ke kontainer layanan.
    • Untuk memanggil setelahnya, posisikan pendaftaran layanan setelah pustaka ditambahkan.

Catatan: Anda tidak dapat memperluas aplikasi ASP.NET Core saat mengambil alih Configure. Untuk informasi lebih lanjut, lihat masalah GitHub ini.

Menambahkan konfigurasi saat startup dari rakitan eksternal

Implementasi IHostingStartup memungkinkan penambahan penyempurnaan ke aplikasi saat startup dari rakitan eksternal di luar file aplikasi Program.cs . Untuk informasi selengkapnya, lihat Menggunakan rakitan startup hosting di ASP.NET Core.

Kelas Startup mengonfigurasi layanan dan alur permintaan aplikasi.

Kelas Startup

aplikasi ASP.NET Core menggunakan Startup kelas, yang dinamai Startup berdasarkan konvensi. Kelas Startup:

  • Secara opsional menyertakan ConfigureServices metode untuk mengonfigurasi layanan aplikasi. Layanan adalah komponen yang dapat digunakan kembali yang menyediakan fungsionalitas aplikasi. Layanan terdaftar dan digunakan di ConfigureServices seluruh aplikasi melalui injeksi dependensi (DI) atau ApplicationServices.
  • Configure Menyertakan metode untuk membuat alur pemrosesan permintaan aplikasi.

ConfigureServices dan Configure dipanggil oleh runtime ASP.NET Core saat aplikasi dimulai:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Sampel sebelumnya adalah untuk Razor Pages; versi MVC serupa.

Kelas Startup ditentukan saat host aplikasi dibuat. Kelas Startup biasanya ditentukan dengan memanggil WebHostBuilderExtensions.UseStartup/<TStartup> metode pada pembangun host:

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

Host menyediakan layanan yang tersedia untuk Startup konstruktor kelas. Aplikasi ini menambahkan layanan tambahan melalui ConfigureServices. Layanan host dan aplikasi tersedia di dan di Configure seluruh aplikasi.

Hanya jenis layanan berikut yang dapat disuntikkan ke Startup konstruktor saat menggunakan Host Generik (IHostBuilder):

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        }
        else
        {
        }
    }
}

Sebagian besar layanan tidak tersedia sampai metode dipanggil Configure .

Beberapa Startup

Saat aplikasi menentukan kelas terpisah Startup untuk lingkungan yang berbeda (misalnya, StartupDevelopment), kelas yang sesuai Startup dipilih saat runtime. Kelas yang akhiran namanya cocok dengan lingkungan saat ini diprioritaskan. Jika aplikasi dijalankan di lingkungan Pengembangan dan menyertakan Startup kelas dan StartupDevelopment kelas, StartupDevelopment kelas akan digunakan. Untuk informasi selengkapnya, lihat Menggunakan beberapa lingkungan.

Lihat Host untuk informasi selengkapnya tentang host. Untuk informasi tentang menangani kesalahan selama startup, lihat Penanganan pengecualian startup.

Metode ConfigureServices

Metodenya ConfigureServices adalah:

  • Opsional.
  • Dipanggil oleh host sebelum Configure metode untuk mengonfigurasi layanan aplikasi.
  • Di mana opsi konfigurasi diatur menurut konvensi.

Host dapat mengonfigurasi beberapa layanan sebelum Startup metode dipanggil. Untuk informasi selengkapnya, lihat Host.

Untuk fitur yang memerlukan penyiapan substansial, ada Add{Service} metode ekstensi pada IServiceCollection. Misalnya, TambahkanDbContext, TambahkanDefaultIdentity, TambahkanEntityFrameworkStores, dan TambahkanRazorHalaman:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();
    }

Menambahkan layanan ke kontainer layanan membuatnya tersedia dalam aplikasi dan dalam Configure metode . Layanan diselesaikan melalui injeksi dependensi atau dari ApplicationServices.

Metode Konfigurasi

Metode Configure ini digunakan untuk menentukan bagaimana aplikasi merespons permintaan HTTP. Alur permintaan dikonfigurasi dengan menambahkan komponen middleware ke IApplicationBuilder instans. IApplicationBuilder tersedia untuk Configure metode , tetapi tidak terdaftar dalam kontainer layanan. Hosting membuat IApplicationBuilder dan meneruskannya langsung ke Configure.

Templat ASP.NET Core mengonfigurasi alur dengan dukungan untuk:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Sampel sebelumnya adalah untuk Razor Pages; versi MVC serupa.

Setiap Use metode ekstensi menambahkan satu atau beberapa komponen middleware ke alur permintaan. Misalnya, UseStaticFiles mengonfigurasi middleware untuk melayani file statis.

Setiap komponen middleware dalam alur permintaan bertanggung jawab untuk memanggil komponen berikutnya dalam alur atau sirkuit pendek rantai, jika sesuai.

Layanan tambahan, seperti IWebHostEnvironment, ILoggerFactory, atau apa pun yang ditentukan dalam ConfigureServices, dapat ditentukan dalam Configure tanda tangan metode. Layanan ini disuntikkan jika tersedia.

Untuk informasi selengkapnya tentang cara menggunakan IApplicationBuilder dan urutan pemrosesan middleware, lihat ASP.NET Core Middleware.

Mengonfigurasi layanan tanpa Startup

Untuk mengonfigurasi layanan dan alur pemrosesan permintaan tanpa menggunakan Startup kelas, panggil ConfigureServices dan Configure metode kenyamanan pada pembuat host. Beberapa panggilan untuk ConfigureServices ditambahkan satu dengan yang lain. Jika ada beberapa Configure panggilan metode, panggilan terakhir Configure digunakan.

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

Perluas Startup dengan filter startup

Gunakan IStartupFilter:

  • Untuk mengonfigurasi middleware di awal atau akhir alur Konfigurasi middleware aplikasi tanpa panggilan eksplisit ke Use{Middleware}. IStartupFilter digunakan oleh ASP.NET Core untuk menambahkan default ke awal alur tanpa harus membuat penulis aplikasi secara eksplisit mendaftarkan middleware default. IStartupFilter memungkinkan komponen yang berbeda untuk memanggil Use{Middleware} atas nama penulis aplikasi.
  • Untuk membuat alur Configure metode. IStartupFilter.Configure dapat mengatur middleware untuk dijalankan sebelum atau sesudah middleware ditambahkan oleh pustaka.

IStartupFilterConfiguremengimplementasikan , yang menerima dan mengembalikan Action<IApplicationBuilder>. Menentukan IApplicationBuilder kelas untuk mengonfigurasi alur permintaan aplikasi. Untuk informasi selengkapnya, lihat Membuat alur middleware dengan IApplicationBuilder.

Masing-masing IStartupFilter dapat menambahkan satu atau beberapa middleware dalam alur permintaan. Filter dipanggil dalam urutan ditambahkan ke kontainer layanan. Filter dapat menambahkan middleware sebelum atau sesudah meneruskan kontrol ke filter berikutnya, sehingga ditambahkan ke awal atau akhir alur aplikasi.

Contoh berikut menunjukkan cara mendaftarkan middleware dengan IStartupFilter. Middleware RequestSetOptionsMiddleware menetapkan nilai opsi dari parameter string kueri:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware( RequestDelegate next )
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

dikonfigurasi RequestSetOptionsMiddleware di RequestSetOptionsStartupFilter kelas :

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

IStartupFilter terdaftar dalam kontainer layanan di ConfigureServices.

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((hostingContext, config) =>
           {
           })
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder.UseStartup<Startup>();
         })
        .ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();
        });
}

Saat parameter string kueri untuk option disediakan, middleware memproses penetapan nilai sebelum middleware ASP.NET Core merender respons.

Urutan eksekusi middleware ditetapkan oleh urutan IStartupFilter pendaftaran:

  • Beberapa IStartupFilter implementasi dapat berinteraksi dengan objek yang sama. Jika pemesanan penting, pesan pendaftaran layanan mereka IStartupFilter agar sesuai dengan urutan yang harus dijalankan middleware mereka.

  • Pustaka dapat menambahkan middleware dengan satu atau beberapa IStartupFilter implementasi yang berjalan sebelum atau sesudah middleware aplikasi lain yang terdaftar dengan IStartupFilter. Untuk memanggil IStartupFilter middleware sebelum middleware ditambahkan oleh pustaka IStartupFilter:

    • Posisikan pendaftaran layanan sebelum pustaka ditambahkan ke kontainer layanan.
    • Untuk memanggil setelahnya, posisikan pendaftaran layanan setelah pustaka ditambahkan.

Menambahkan konfigurasi saat startup dari rakitan eksternal

Implementasi IHostingStartup memungkinkan penambahan penyempurnaan ke aplikasi saat startup dari rakitan eksternal di luar kelas Startup aplikasi. Untuk informasi selengkapnya, lihat Menggunakan rakitan startup hosting di ASP.NET Core.

Sumber Daya Tambahan: