Активация ПО промежуточного слоя с помощью контейнера сторонних разработчиков в ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
В этой статье демонстрируется использование IMiddlewareFactory и IMiddleware в качестве точки расширяемости для активации ПО промежуточного слоя с помощью контейнера сторонних разработчиков. Вводные сведения о IMiddlewareFactory
и IMiddleware
см. в статье Активация ПО промежуточного слоя на основе фабрики в ASP.NET Core.
Просмотреть или скачать образец кода (описание загрузки)
В примере приложения показана активация ПО промежуточного слоя путем реализации IMiddlewareFactory
, SimpleInjectorMiddlewareFactory
. В этом образце используется контейнер внедрения зависимостей Simple Injector.
Реализация ПО промежуточного слоя в примере записывает значение, предоставленное в параметре строки запроса (key
). ПО промежуточного слоя использует внедренный контекст базы данных (служба с заданной областью) для записи значения строки запроса в базу данных, выполняющуюся в памяти.
Примечание.
В примере приложения Simple Injector используется исключительно для демонстрации. Использование Simple Injector не означает поддержку данного инструмента. Подходы к активации ПО промежуточного слоя, описанные в документации по Simple Injector и статьях на GitHub, рекомендованы командой Simple Injector. Дополнительные сведения см. в документации по Simple Injector и в репозитории Simple Injector в GitHub.
IMiddlewareFactory
IMiddlewareFactory предоставляет методы для создания ПО промежуточного слоя.
В примере приложения реализуется фабрика ПО промежуточного слоя для создания экземпляра SimpleInjectorActivatedMiddleware
. Фабрика ПО промежуточного слоя использует контейнер Simple Injector для разрешения по промежуточного слоя:
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware
IMiddleware определяет ПО промежуточного слоя для конвейера запросов приложения.
ПО промежуточного слоя, активированное реализацией IMiddlewareFactory
(Middleware/SimpleInjectorActivatedMiddleware.cs
):
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(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 = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
Расширение создается для ПО промежуточного слоя (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
должен выполнять несколько задач:
- Настройка контейнера Simple Injector.
- Регистрация фабрики и ПО промежуточного слоя.
- Предоставление контекста базы данных приложения из контейнера Simple Injector.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
ПО промежуточного слоя регистрируется в конвейере обработки запросов в Startup.Configure
:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
В этой статье демонстрируется использование IMiddlewareFactory и IMiddleware в качестве точки расширяемости для активации ПО промежуточного слоя с помощью контейнера сторонних разработчиков. Вводные сведения о IMiddlewareFactory
и IMiddleware
см. в статье Активация ПО промежуточного слоя на основе фабрики в ASP.NET Core.
Просмотреть или скачать образец кода (описание загрузки)
В примере приложения показана активация ПО промежуточного слоя путем реализации IMiddlewareFactory
, SimpleInjectorMiddlewareFactory
. В этом образце используется контейнер внедрения зависимостей Simple Injector.
Реализация ПО промежуточного слоя в примере записывает значение, предоставленное в параметре строки запроса (key
). ПО промежуточного слоя использует внедренный контекст базы данных (служба с заданной областью) для записи значения строки запроса в базу данных, выполняющуюся в памяти.
Примечание.
В примере приложения Simple Injector используется исключительно для демонстрации. Использование Simple Injector не означает поддержку данного инструмента. Подходы к активации ПО промежуточного слоя, описанные в документации по Simple Injector и статьях на GitHub, рекомендованы командой Simple Injector. Дополнительные сведения см. в документации по Simple Injector и в репозитории Simple Injector в GitHub.
IMiddlewareFactory
IMiddlewareFactory предоставляет методы для создания ПО промежуточного слоя.
В примере приложения реализуется фабрика ПО промежуточного слоя для создания экземпляра SimpleInjectorActivatedMiddleware
. Фабрика ПО промежуточного слоя использует контейнер Simple Injector для разрешения по промежуточного слоя:
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware
IMiddleware определяет ПО промежуточного слоя для конвейера запросов приложения.
ПО промежуточного слоя, активированное реализацией IMiddlewareFactory
(Middleware/SimpleInjectorActivatedMiddleware.cs
):
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(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 = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
Расширение создается для ПО промежуточного слоя (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
должен выполнять несколько задач:
- Настройка контейнера Simple Injector.
- Регистрация фабрики и ПО промежуточного слоя.
- Предоставление контекста базы данных приложения из контейнера Simple Injector.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
ПО промежуточного слоя регистрируется в конвейере обработки запросов в Startup.Configure
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}
Дополнительные ресурсы
ASP.NET Core