ASP.NET Core의 팩터리 기반 미들웨어 활성화
IMiddlewareFactory/IMiddleware는 다음과 같은 이점을 제공하는 미들웨어 활성화를 위한 확장 포인트입니다.
- 클라이언트 요청당 활성화(범위가 지정된 서비스 주입)
- 미들웨어의 강력한 형식 지정
UseMiddleware 확장 메서드는 미들웨어의 등록된 형식이 IMiddleware를 구현하는지 확인합니다. 구현하는 경우 컨테이너에 등록된 IMiddlewareFactory 인스턴스는 규칙 기반 미들웨어 활성화 논리를 사용하는 대신 IMiddleware 구현을 확인하는 데 사용됩니다. 미들웨어는 앱의 서비스 컨테이너의 범위가 지정되거나 일시적인 서비스로 등록됩니다.
IMiddleware는 클라이언트 요청(연결)마다 활성화되므로 범위가 지정된 서비스는 미들웨어의 생성자에 주입될 수 있습니다.
IMiddleware
IMiddleware는 앱의 요청 파이프라인에 대한 미들웨어를 정의합니다. InvokeAsync(HttpContext, RequestDelegate) 메서드는 요청을 처리하고 미들웨어의 실행을 나타내는 Task를 반환합니다.
규칙에 따라 미들웨어 활성화:
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);
}
}
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);
}
}
확장은 미들웨어에 대해 생성됩니다.
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseConventionalMiddleware(
this IApplicationBuilder app)
=> app.UseMiddleware<ConventionalMiddleware>();
public static IApplicationBuilder UseFactoryActivatedMiddleware(
this IApplicationBuilder app)
=> app.UseMiddleware<FactoryActivatedMiddleware>();
}
개체를 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);
}
팩터리 활성화된 미들웨어는 Program.cs
의 기본 제공 컨테이너에 추가됩니다.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<SampleDbContext>
(options => options.UseInMemoryDatabase("SampleDb"));
builder.Services.AddTransient<FactoryActivatedMiddleware>();
두 미들웨어는 모두 Program.cs
의 요청 처리 파이프라인에 등록됩니다.
var app = builder.Build();
app.UseConventionalMiddleware();
app.UseFactoryActivatedMiddleware();
IMiddlewareFactory
IMiddlewareFactory는 미들웨어를 만드는 메서드를 제공합니다. 미들웨어 팩터리 구현은 범위가 지정된 서비스로 컨테이너에 등록됩니다.
기본 IMiddlewareFactory 구현인 MiddlewareFactory는 Microsoft.AspNetCore.Http 패키지에 있습니다.
추가 리소스
IMiddlewareFactory/IMiddleware는 미들웨어 활성화에 대한 확장성 지점입니다.
UseMiddleware 확장 메서드는 미들웨어의 등록된 형식이 IMiddleware를 구현하는지 확인합니다. 구현하는 경우 컨테이너에 등록된 IMiddlewareFactory 인스턴스는 규칙 기반 미들웨어 활성화 논리를 사용하는 대신 IMiddleware 구현을 확인하는 데 사용됩니다. 미들웨어는 앱의 서비스 컨테이너의 범위가 지정되거나 일시적인 서비스로 등록됩니다.
혜택:
- 클라이언트 요청당 활성화(범위가 지정된 서비스 주입)
- 미들웨어의 강력한 형식 지정
IMiddleware는 클라이언트 요청(연결)마다 활성화되므로 범위가 지정된 서비스는 미들웨어의 생성자에 주입될 수 있습니다.
IMiddleware
IMiddleware는 앱의 요청 파이프라인에 대한 미들웨어를 정의합니다. InvokeAsync(HttpContext, RequestDelegate) 메서드는 요청을 처리하고 미들웨어의 실행을 나타내는 Task를 반환합니다.
규칙에 따라 미들웨어 활성화:
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);
}
}
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);
}
}
확장은 미들웨어에 대해 생성됩니다.
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>();
}
}
개체를 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);
}
팩터리 활성화된 미들웨어는 Startup.ConfigureServices
의 기본 제공 컨테이너에 추가됩니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddRazorPages();
}
두 미들웨어는 모두 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는 미들웨어를 만드는 메서드를 제공합니다. 미들웨어 팩터리 구현은 범위가 지정된 서비스로 컨테이너에 등록됩니다.
기본 IMiddlewareFactory 구현인 MiddlewareFactory는 Microsoft.AspNetCore.Http 패키지에 있습니다.
추가 리소스
IMiddlewareFactory/IMiddleware는 미들웨어 활성화에 대한 확장성 지점입니다.
UseMiddleware 확장 메서드는 미들웨어의 등록된 형식이 IMiddleware를 구현하는지 확인합니다. 구현하는 경우 컨테이너에 등록된 IMiddlewareFactory 인스턴스는 규칙 기반 미들웨어 활성화 논리를 사용하는 대신 IMiddleware 구현을 확인하는 데 사용됩니다. 미들웨어는 앱의 서비스 컨테이너의 범위가 지정되거나 일시적인 서비스로 등록됩니다.
혜택:
- 클라이언트 요청당 활성화(범위가 지정된 서비스 주입)
- 미들웨어의 강력한 형식 지정
IMiddleware는 클라이언트 요청(연결)마다 활성화되므로 범위가 지정된 서비스는 미들웨어의 생성자에 주입될 수 있습니다.
IMiddleware
IMiddleware는 앱의 요청 파이프라인에 대한 미들웨어를 정의합니다. InvokeAsync(HttpContext, RequestDelegate) 메서드는 요청을 처리하고 미들웨어의 실행을 나타내는 Task를 반환합니다.
규칙에 따라 미들웨어 활성화:
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);
}
}
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);
}
}
확장은 미들웨어에 대해 생성됩니다.
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>();
}
}
개체를 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);
}
팩터리 활성화된 미들웨어는 Startup.ConfigureServices
의 기본 제공 컨테이너에 추가됩니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
두 미들웨어는 모두 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는 미들웨어를 만드는 메서드를 제공합니다. 미들웨어 팩터리 구현은 범위가 지정된 서비스로 컨테이너에 등록됩니다.
기본 IMiddlewareFactory 구현인 MiddlewareFactory는 Microsoft.AspNetCore.Http 패키지에 있습니다.
추가 리소스
ASP.NET Core
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기