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

IMiddlewareFactory/IMiddleware, ara yazılım etkinleştirmesi için aşağıdaki avantajları sunan bir genişletilebilirlik noktasıdır:

  • İstemci isteği başına etkinleştirme (kapsamlı hizmetlerin eklenmesi)
  • Güçlü ara yazılım yazma

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

IMiddleware istemci isteği (bağlantı) başına etkinleştirildiğinden, kapsamı belirlenmiş hizmetler ara yazılımının oluşturucusuna eklenebilir.

IMiddleware

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ının yürütülmesini temsil eden bir Task 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, 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);
    }
}

tarafından MiddlewareFactoryetkinleştirilen ara yazılım:

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

Ara yazılım için uzantılar oluşturulur:

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

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

ile UseMiddlewarenesneleri fabrika tarafından etkinleştirilen ara yazılıma geçirmek mümkün değildir:

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

Fabrika tarafından etkinleştirilen ara yazılım, içindeki Program.csyerleşik kapsayıcıya eklenir:

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddTransient<FactoryActivatedMiddleware>();

Her iki ara yazılım da içinde istek işleme işlem hattına Program.cskaydedilir:

var app = builder.Build();

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

IMiddlewareFactory

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.

Ek kaynaklar

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

UseMiddleware uzantı yöntemleri, ara yazılımların kayıtlı türünün uygulamasının olup IMiddlewareolmadığını denetler. Bu durumda kapsayıcıya IMiddlewareFactory kaydedilen örnek, kural tabanlı ara yazılım etkinleştirme mantığını kullanmak yerine uygulamayı çözümlemek IMiddleware 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ı hizmetlerin eklenmesi)
  • Güçlü ara yazılım yazma

IMiddleware istemci isteği (bağlantı) başına etkinleştirildiğinden, kapsamı belirlenmiş hizmetler ara yazılımının oluşturucusuna eklenebilir.

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

IMiddleware

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ının yürütülmesini temsil eden bir Task 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 MiddlewareFactoryetkinleştirilen ara 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);
    }
}

Ara yazılım 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>();
    }
}

ile UseMiddlewarenesneleri fabrika tarafından etkinleştirilen ara yazılıma geçirmek mümkün 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çindeki Startup.ConfigureServicesyerleşik kapsayıcıya eklenir:

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

    services.AddTransient<FactoryActivatedMiddleware>();

    services.AddRazorPages();
}

Her iki ara yazılım da içindeki istek işleme işlem hattına Startup.Configurekaydedilir:

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 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.

Ek kaynaklar

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

UseMiddleware uzantı yöntemleri, ara yazılımların kayıtlı türünün uygulamasının olup IMiddlewareolmadığını denetler. Bu durumda kapsayıcıya IMiddlewareFactory kaydedilen örnek, kural tabanlı ara yazılım etkinleştirme mantığını kullanmak yerine uygulamayı çözümlemek IMiddleware 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ı hizmetlerin eklenmesi)
  • Güçlü ara yazılım yazma

IMiddleware istemci isteği (bağlantı) başına etkinleştirildiğinden, kapsamı belirlenmiş hizmetler ara yazılımının oluşturucusuna eklenebilir.

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

IMiddleware

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ının yürütülmesini temsil eden bir Task 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 MiddlewareFactoryetkinleştirilen ara 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);
    }
}

Ara yazılım 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>();
    }
}

ile UseMiddlewarenesneleri fabrika tarafından etkinleştirilen ara yazılıma geçirmek mümkün 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çindeki Startup.ConfigureServicesyerleşik kapsayıcıya 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 ara yazılım da içindeki istek işleme işlem hattına Startup.Configurekaydedilir:

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 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.

Ek kaynaklar