Bagikan melalui


Aktivasi middleware berbasis pabrik di ASP.NET Core

Catatan

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

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. 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.

IMiddlewareFactory/IMiddleware adalah titik ekstensibilitas untuk aktivasi middleware yang menawarkan manfaat berikut:

  • Aktivasi per permintaan klien (injeksi layanan terlingkup)
  • Pengetikan middleware yang kuat

UseMiddleware metode ekstensi memeriksa apakah jenis terdaftar middleware mengimplementasikan IMiddleware. Jika ya, IMiddlewareFactory instans yang terdaftar dalam kontainer digunakan untuk menyelesaikan IMiddleware implementasi alih-alih menggunakan logika aktivasi middleware berbasis konvensi. Middleware terdaftar sebagai layanan terlingkup atau sementara dalam kontainer layanan aplikasi.

IMiddleware diaktifkan per permintaan klien (koneksi), sehingga layanan terlingkup dapat disuntikkan ke konstruktor middleware.

IMiddleware

IMiddleware menentukan middleware untuk alur permintaan aplikasi. Metode InvokeAsync(HttpContext, RequestDelegate) menangani permintaan dan mengembalikan Task yang mewakili eksekusi middleware.

Middleware diaktifkan oleh konvensi:

public class ConventionalMiddleware
{
    private readonly RequestDelegate _next;

    public ConventionalMiddleware(RequestDelegate next)
        => _next = next;

    public async Task InvokeAsync(HttpContext context, SampleDbContext dbContext)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            dbContext.Requests.Add(new Request("Conventional", keyValue));

            await dbContext.SaveChangesAsync();
        }

        await _next(context);
    }
}

Middleware diaktifkan oleh MiddlewareFactory:

public class FactoryActivatedMiddleware : IMiddleware
{
    private readonly SampleDbContext _dbContext;

    public FactoryActivatedMiddleware(SampleDbContext dbContext)
        => _dbContext = dbContext;

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            _dbContext.Requests.Add(new Request("Factory", keyValue));

            await _dbContext.SaveChangesAsync();
        }

        await next(context);
    }
}

Ekstensi dibuat untuk middleware:

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseConventionalMiddleware(
        this IApplicationBuilder app)
        => app.UseMiddleware<ConventionalMiddleware>();

    public static IApplicationBuilder UseFactoryActivatedMiddleware(
        this IApplicationBuilder app)
        => app.UseMiddleware<FactoryActivatedMiddleware>();
}

Tidak dimungkinkan untuk meneruskan objek ke middleware yang diaktifkan pabrik dengan UseMiddleware:

public static IApplicationBuilder UseFactoryActivatedMiddleware(
    this IApplicationBuilder app, bool option)
{
    // Passing 'option' as an argument throws a NotSupportedException at runtime.
    return app.UseMiddleware<FactoryActivatedMiddleware>(option);
}

Middleware yang diaktifkan pabrik ditambahkan ke kontainer bawaan di Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<SampleDbContext>
    (options => options.UseInMemoryDatabase("SampleDb"));

builder.Services.AddTransient<FactoryActivatedMiddleware>();

Kedua middleware terdaftar dalam alur pemrosesan permintaan, juga dalam Program.cs:

var app = builder.Build();

app.UseConventionalMiddleware();
app.UseFactoryActivatedMiddleware();

IMiddlewareFactory

IMiddlewareFactory menyediakan metode untuk membuat middleware. Implementasi pabrik middleware terdaftar dalam kontainer sebagai layanan terlingkup.

Implementasi default IMiddlewareFactory , MiddlewareFactory, ditemukan dalam paket Microsoft.AspNetCore.Http .

Sumber Daya Tambahan:

IMiddlewareFactory/IMiddleware adalah titik ekstensibilitas untuk aktivasi middleware .

UseMiddleware metode ekstensi memeriksa apakah jenis terdaftar middleware mengimplementasikan IMiddleware. Jika ya, IMiddlewareFactory instans yang terdaftar dalam kontainer digunakan untuk menyelesaikan IMiddleware implementasi alih-alih menggunakan logika aktivasi middleware berbasis konvensi. Middleware terdaftar sebagai layanan terlingkup atau sementara dalam kontainer layanan aplikasi.

Keuntungan:

  • Aktivasi per permintaan klien (injeksi layanan terlingkup)
  • Pengetikan middleware yang kuat

IMiddleware diaktifkan per permintaan klien (koneksi), sehingga layanan terlingkup dapat disuntikkan ke konstruktor middleware.

Melihat atau mengunduh kode sampel (cara mengunduh)

IMiddleware

IMiddleware menentukan middleware untuk alur permintaan aplikasi. Metode InvokeAsync(HttpContext, RequestDelegate) menangani permintaan dan mengembalikan Task yang mewakili eksekusi middleware.

Middleware diaktifkan oleh konvensi:

public class ConventionalMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context, AppDbContext db)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            db.Add(new Request()
                {
                    DT = DateTime.UtcNow, 
                    MiddlewareActivation = "ConventionalMiddleware", 
                    Value = keyValue
                });

            await db.SaveChangesAsync();
        }

        await _next(context);
    }
}

Middleware diaktifkan oleh MiddlewareFactory:

public class FactoryActivatedMiddleware : IMiddleware
{
    private readonly AppDbContext _db;

    public FactoryActivatedMiddleware(AppDbContext db)
    {
        _db = db;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            _db.Add(new Request()
                {
                    DT = DateTime.UtcNow, 
                    MiddlewareActivation = "FactoryActivatedMiddleware", 
                    Value = keyValue
                });

            await _db.SaveChangesAsync();
        }

        await next(context);
    }
}

Ekstensi dibuat untuk middleware:

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseConventionalMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<ConventionalMiddleware>();
    }

    public static IApplicationBuilder UseFactoryActivatedMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<FactoryActivatedMiddleware>();
    }
}

Tidak dimungkinkan untuk meneruskan objek ke middleware yang diaktifkan pabrik dengan UseMiddleware:

public static IApplicationBuilder UseFactoryActivatedMiddleware(
    this IApplicationBuilder builder, bool option)
{
    // Passing 'option' as an argument throws a NotSupportedException at runtime.
    return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}

Middleware yang diaktifkan pabrik ditambahkan ke kontainer bawaan di Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options =>
        options.UseInMemoryDatabase("InMemoryDb"));

    services.AddTransient<FactoryActivatedMiddleware>();

    services.AddRazorPages();
}

Kedua middleware terdaftar dalam alur pemrosesan permintaan di Startup.Configure:

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

    app.UseConventionalMiddleware();
    app.UseFactoryActivatedMiddleware();

    app.UseStaticFiles();
    app.UseRouting();

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

IMiddlewareFactory

IMiddlewareFactory menyediakan metode untuk membuat middleware. Implementasi pabrik middleware terdaftar dalam kontainer sebagai layanan terlingkup.

Implementasi default IMiddlewareFactory , MiddlewareFactory, ditemukan dalam paket Microsoft.AspNetCore.Http .

Sumber Daya Tambahan:

IMiddlewareFactory/IMiddleware adalah titik ekstensibilitas untuk aktivasi middleware .

UseMiddleware metode ekstensi memeriksa apakah jenis terdaftar middleware mengimplementasikan IMiddleware. Jika ya, IMiddlewareFactory instans yang terdaftar dalam kontainer digunakan untuk menyelesaikan IMiddleware implementasi alih-alih menggunakan logika aktivasi middleware berbasis konvensi. Middleware terdaftar sebagai layanan terlingkup atau sementara dalam kontainer layanan aplikasi.

Keuntungan:

  • Aktivasi per permintaan klien (injeksi layanan terlingkup)
  • Pengetikan middleware yang kuat

IMiddleware diaktifkan per permintaan klien (koneksi), sehingga layanan terlingkup dapat disuntikkan ke konstruktor middleware.

Melihat atau mengunduh kode sampel (cara mengunduh)

IMiddleware

IMiddleware menentukan middleware untuk alur permintaan aplikasi. Metode InvokeAsync(HttpContext, RequestDelegate) menangani permintaan dan mengembalikan Task yang mewakili eksekusi middleware.

Middleware diaktifkan oleh konvensi:

public class ConventionalMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext context, AppDbContext db)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            db.Add(new Request()
                {
                    DT = DateTime.UtcNow, 
                    MiddlewareActivation = "ConventionalMiddleware", 
                    Value = keyValue
                });

            await db.SaveChangesAsync();
        }

        await _next(context);
    }
}

Middleware diaktifkan oleh MiddlewareFactory:

public class FactoryActivatedMiddleware : IMiddleware
{
    private readonly AppDbContext _db;

    public FactoryActivatedMiddleware(AppDbContext db)
    {
        _db = db;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        var keyValue = context.Request.Query["key"];

        if (!string.IsNullOrWhiteSpace(keyValue))
        {
            _db.Add(new Request()
                {
                    DT = DateTime.UtcNow, 
                    MiddlewareActivation = "FactoryActivatedMiddleware", 
                    Value = keyValue
                });

            await _db.SaveChangesAsync();
        }

        await next(context);
    }
}

Ekstensi dibuat untuk middleware:

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseConventionalMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<ConventionalMiddleware>();
    }

    public static IApplicationBuilder UseFactoryActivatedMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<FactoryActivatedMiddleware>();
    }
}

Tidak dimungkinkan untuk meneruskan objek ke middleware yang diaktifkan pabrik dengan UseMiddleware:

public static IApplicationBuilder UseFactoryActivatedMiddleware(
    this IApplicationBuilder builder, bool option)
{
    // Passing 'option' as an argument throws a NotSupportedException at runtime.
    return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}

Middleware yang diaktifkan pabrik ditambahkan ke kontainer bawaan di Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options =>
        options.UseInMemoryDatabase("InMemoryDb"));

    services.AddTransient<FactoryActivatedMiddleware>();

    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Kedua middleware terdaftar dalam alur pemrosesan permintaan di Startup.Configure:

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

    app.UseConventionalMiddleware();
    app.UseFactoryActivatedMiddleware();

    app.UseStaticFiles();
    app.UseMvc();
}

IMiddlewareFactory

IMiddlewareFactory menyediakan metode untuk membuat middleware. Implementasi pabrik middleware terdaftar dalam kontainer sebagai layanan terlingkup.

Implementasi default IMiddlewareFactory , MiddlewareFactory, ditemukan dalam paket Microsoft.AspNetCore.Http .

Sumber Daya Tambahan: