ASP.NET Core 'de fabrika tabanlı ara yazılım etkinleştirmesi

IMiddlewareFactory/IMiddleware , Ara yazılım etkinleştirme için bir genişletilebilirlik noktasıdır.

UseMiddleware Uzantı yöntemleri bir ara yazılımın kayıtlı türünün uygulayıp uygulamadığını denetler IMiddleware . Bu durumda, IMiddlewareFactory kapsayıcıya kaydedilen örnek, IMiddleware kural tabanlı ara yazılım etkinleştirme mantığını kullanmak yerine, uygulamayı çözmek için kullanılır. Ara yazılım, uygulamanın hizmet kapsayıcısında kapsamlı veya geçici bir hizmet olarak kaydedilir.

Avantajlar:

  • İstemci isteği başına etkinleştirme (kapsamlı hizmetler ekleme)
  • Ara yazılım sıkı yazma

IMiddleware istemci isteği başına etkinleştirilir (bağlantı), bu nedenle kapsamlı hizmetler ara yazılım oluşturucusuna eklenebilir.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

Imıddliware

IMiddleware uygulamanın istek ardışık düzeni için ara yazılımı tanımlar. InvokeAsync (HttpContext, RequestDelegate) yöntemi istekleri işler ve Task Ara yazılım yürütmesini temsil eden bir döndürür.

Kurala göre etkinleştirilen ara yazılım:

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

Etkinleştirilen ara yazılım 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);
    }
}

Middlewares için Uzantılar oluşturulur:

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

Nesneleri fabrikada etkinleştirilen bir ara yazılıma geçirmek mümkün değildir 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);
}

Fabrikada etkinleştirilen ara yazılım, içindeki yerleşik kapsayıcıya eklenir Startup.ConfigureServices :

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

    services.AddTransient<FactoryActivatedMiddleware>();

    services.AddRazorPages();
}

Her iki middlewares de istek işleme ardışık düzeninde kaydedilir 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();
    });
}

IMiwareFactory

IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar. Ara yazılım fabrikası uygulaması kapsayıcıya kapsamlı bir hizmet olarak kaydedilir.

Varsayılan IMiddlewareFactory uygulama olan MiddlewareFactory , Microsoft.AspNetCore.Http paketinde bulunur.

IMiddlewareFactory/IMiddleware, ara yazılım etkinleştirmesi için bir genişletilebilirlik noktasıdır.

UseMiddleware uzantı yöntemleri, ara yazılımların kayıtlı türünün uygulayarak uygulamadığını kontrol IMiddleware edin. Varsa, kapsayıcıya kaydedilen örnek, kural tabanlı ara yazılım etkinleştirme mantığını kullanmak IMiddlewareFactory IMiddleware yerine uygulama çözümlemek için kullanılır. Ara yazılım, uygulamanın hizmet kapsayıcısı içinde kapsamlı veya geçici bir hizmet olarak kaydedilir.

Avantajlar:

  • İstemci isteği başına etkinleştirme (kapsamlı hizmetlerin eklemesi)
  • Ara yazılım için güçlü yazma

IMiddleware istemci isteği (bağlantı) başına etkinleştirildiğinden, kapsamlı hizmetler ara yazılım oluşturucus una eklemeye devam eder.

Örnek kodu görüntüleme veya indirme ( nasılindir)

IMiware

IMiddleware uygulamanın istek işlem hattı için ara yazılımı tanımlar. InvokeAsync(HttpContext, RequestDelegate) yöntemi istekleri işler ve ara yazılımı yürütmeyi Task temsil eden bir döndürür.

Kural tarafından etkinleştirilen ara yazılım:

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

tarafından etkinleştirilen ara MiddlewareFactory yazılım:

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

Uzantılar ara yazılım için oluşturulur:

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

ile fabrika tarafından etkinleştirilmiş ara yazılıma nesne geçişi yapmak mümkün UseMiddleware değildir:

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

Fabrika tarafından etkinleştirilen ara yazılım, içinde yerleşik kapsayıcıya Startup.ConfigureServices eklenir:

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

    services.AddTransient<FactoryActivatedMiddleware>();

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

Her iki middlewares de istek işleme ardışık düzeninde kaydedilir 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();
}

Imıddliwarefactory

IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar. Ara yazılım Fabrikası Uygulama, kapsayıcıda kapsamlı bir hizmet olarak kaydedilir.

Varsayılan IMiddlewareFactory uygulama, MiddlewareFactory Microsoft. Aspnetcore. http paketinde bulunur.

Ek kaynaklar