Активация ПО промежуточного слоя на основе фабрики в ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 8 этой статьи.
IMiddlewareFactory/IMiddleware — это точка расширения для активации ПО промежуточного слоя, которая предоставляет следующие преимущества:
- Активация по клиентскому запросу (внедрение ограниченных служб)
- Строгая типизация ПО промежуточного слоя
Методы расширения UseMiddleware проверяют, реализует ли зарегистрированный тип ПО промежуточного слоя IMiddleware. Если да, то экземпляр IMiddlewareFactory, зарегистрированный в контейнере, используется для разрешения реализации IMiddleware вместо стандартной логики активации ПО промежуточного слоя. ПО промежуточного слоя регистрируется как ограниченная (scoped) или временная (temporary) служба в контейнере служб приложения.
IMiddleware активируется по клиентскому запросу (подключению), благодаря чему ограниченные (scoped) службы могут внедряться в конструктор ПО промежуточного слоя.
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 предоставляет методы для создания ПО промежуточного слоя. Реализация ПО промежуточного слоя на основе фабрики регистрируется в контейнере в виде ограниченной (scoped) службы.
Реализация IMiddlewareFactory по умолчанию, MiddlewareFactory, находится в пакете Microsoft.AspNetCore.Http.
Дополнительные ресурсы
IMiddlewareFactory/IMiddleware — это точка расширяемости для активации ПО промежуточного слоя.
Методы расширения UseMiddleware проверяют, реализует ли зарегистрированный тип ПО промежуточного слоя IMiddleware. Если да, то экземпляр IMiddlewareFactory, зарегистрированный в контейнере, используется для разрешения реализации IMiddleware вместо стандартной логики активации ПО промежуточного слоя. ПО промежуточного слоя регистрируется как ограниченная (scoped) или временная (temporary) служба в контейнере служб приложения.
Преимущества:
- Активация по клиентскому запросу (внедрение ограниченных служб)
- Строгая типизация ПО промежуточного слоя
IMiddleware активируется по клиентскому запросу (подключению), благодаря чему ограниченные (scoped) службы могут внедряться в конструктор ПО промежуточного слоя.
Просмотреть или скачать образец кода (описание загрузки)
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 предоставляет методы для создания ПО промежуточного слоя. Реализация ПО промежуточного слоя на основе фабрики регистрируется в контейнере в виде ограниченной (scoped) службы.
Реализация IMiddlewareFactory по умолчанию, MiddlewareFactory, находится в пакете Microsoft.AspNetCore.Http.
Дополнительные ресурсы
IMiddlewareFactory/IMiddleware — это точка расширяемости для активации ПО промежуточного слоя.
Методы расширения UseMiddleware проверяют, реализует ли зарегистрированный тип ПО промежуточного слоя IMiddleware. Если да, то экземпляр IMiddlewareFactory, зарегистрированный в контейнере, используется для разрешения реализации IMiddleware вместо стандартной логики активации ПО промежуточного слоя. ПО промежуточного слоя регистрируется как ограниченная (scoped) или временная (temporary) служба в контейнере служб приложения.
Преимущества:
- Активация по клиентскому запросу (внедрение ограниченных служб)
- Строгая типизация ПО промежуточного слоя
IMiddleware активируется по клиентскому запросу (подключению), благодаря чему ограниченные (scoped) службы могут внедряться в конструктор ПО промежуточного слоя.
Просмотреть или скачать образец кода (описание загрузки)
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 предоставляет методы для создания ПО промежуточного слоя. Реализация ПО промежуточного слоя на основе фабрики регистрируется в контейнере в виде ограниченной (scoped) службы.
Реализация IMiddlewareFactory по умолчанию, MiddlewareFactory, находится в пакете Microsoft.AspNetCore.Http.
Дополнительные ресурсы
ASP.NET Core