Aktivace middlewaru založená na továrně v ASP.NET Core
IMiddlewareFactory/IMiddleware je bod rozšiřitelnosti pro aktivaci middlewaru .
UseMiddleware rozšiřující metody kontrolují, jestli implementuje registrovaný typ middlewaru IMiddleware . V takovém případě IMiddlewareFactory instance zaregistrovaná v kontejneru slouží k vyřešení IMiddleware implementace namísto použití logiky aktivace middleware založeného na konvencích. Middleware je zaregistrován jako služba v oboru nebo přechodné službě v kontejneru služby aplikace.
Výhody:
- Aktivace na žádost klienta (vkládání oboru služeb)
- Silné zadání middlewaru
IMiddleware je aktivováno na žádost klienta (připojení), takže oborové služby lze vložit do konstruktoru middlewaru.
Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)
IMiddleware
IMiddleware definuje middleware pro kanál žádostí aplikace. Metoda InvokeAsync (HttpContext, RequestDelegate) zpracovává požadavky a vrací Task , která představuje spuštění middlewaru.
Middleware aktivované konvencí:
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 aktivované 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);
}
}
Pro middleware jsou vytvořena rozšíření:
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>();
}
}
Do middlewaru aktivovaného výrobou nelze předat objekty pomocí 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 aktivovaný v továrně se přidají do integrovaného kontejneru v Startup.ConfigureServices :
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddRazorPages();
}
V kanálu zpracování požadavků jsou zaregistrované middleware v 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 poskytuje metody pro vytvoření middlewaru. Implementace služby middleware middleware je registrována v kontejneru jako služba vymezená oborem.
Výchozí IMiddlewareFactory implementace, MiddlewareFactory , se nachází v balíčku Microsoft. AspNetCore. http .
IMiddlewareFactory/IMiddleware je bod rozšiřitelnosti pro aktivaci middlewaru .
UseMiddleware rozšiřující metody kontrolují, jestli implementuje registrovaný typ middlewaru IMiddleware . V takovém případě IMiddlewareFactory instance zaregistrovaná v kontejneru slouží k vyřešení IMiddleware implementace namísto použití logiky aktivace middleware založeného na konvencích. Middleware je zaregistrován jako služba v oboru nebo přechodné službě v kontejneru služby aplikace.
Výhody:
- Aktivace na žádost klienta (vkládání oboru služeb)
- Silné zadání middlewaru
IMiddleware je aktivováno na žádost klienta (připojení), takže oborové služby lze vložit do konstruktoru middlewaru.
Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)
IMiddleware
IMiddleware definuje middleware pro kanál žádostí aplikace. Metoda InvokeAsync (HttpContext, RequestDelegate) zpracovává požadavky a vrací Task , která představuje spuštění middlewaru.
Middleware aktivované konvencí:
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 aktivované 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);
}
}
Pro middleware jsou vytvořena rozšíření:
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>();
}
}
Do middlewaru aktivovaného výrobou nelze předat objekty pomocí 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 aktivovaný v továrně se přidají do integrovaného kontejneru v Startup.ConfigureServices :
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("InMemoryDb"));
services.AddTransient<FactoryActivatedMiddleware>();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Oba middleware jsou zaregistrované v kanálu zpracování požadavků v 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 poskytuje metody pro vytvoření middlewaru. Implementace middlewarové továrny je zaregistrovaná v kontejneru jako vymezená služba.
Výchozí implementace IMiddlewareFactory , se nachází v balíčku MiddlewareFactory Microsoft.AspNetCore.Http.