Aktivace middlewaru s využitím kontejneru třetí strany v ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Tento článek ukazuje, jak používat IMiddlewareFactory a IMiddleware jako bod rozšiřitelnosti pro aktivaci middlewaru s kontejnerem třetí strany. Úvodní informace o IMiddlewareFactory
aktivaci middlewaru založeného na továrně v ASP.NET Core najdete IMiddleware
v tématu o aktivaci middlewaru založeného na továrně.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Ukázková aplikace demonstruje aktivaci middlewaru implementací IMiddlewareFactory
, SimpleInjectorMiddlewareFactory
. Ukázka používá kontejner DI (Simple Injector dependency injection).
Implementace middlewaru ukázky zaznamenává hodnotu zadanou parametrem řetězce dotazu (key
). Middleware používá vložený kontext databáze (službu s vymezeným oborem) k zaznamenání hodnoty řetězce dotazu v databázi v paměti.
Poznámka:
Ukázková aplikace používá jednoduchý injektor čistě pro demonstrační účely. Použití jednoduchého injektoru není doporučení. Přístupy k aktivaci middlewaru popsané v dokumentaci k simple injectoru a problémy s GitHubem se doporučují správci jednoduchého injektoru. Další informace najdete v dokumentaci k simple injectoru a úložišti Simple Injector Na GitHubu.
IMiddlewareFactory
IMiddlewareFactory poskytuje metody pro vytvoření middlewaru.
V ukázkové aplikaci se k vytvoření SimpleInjectorActivatedMiddleware
instance implementuje middlewarová továrna. Middleware factory používá k překladu middlewaru kontejner 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 definuje middleware pro kanál žádosti aplikace.
Middleware aktivovaný implementací 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);
}
}
Vytvoří se rozšíření pro middleware (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
musí provádět několik úloh:
- Nastavte kontejner Simple Injector.
- Zaregistrujte továrnu a middleware.
- Zpřístupněte kontext databáze aplikace z kontejneru 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();
}
Middleware je zaregistrovaný v kanálu zpracování požadavků v 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();
});
}
Tento článek ukazuje, jak používat IMiddlewareFactory a IMiddleware jako bod rozšiřitelnosti pro aktivaci middlewaru s kontejnerem třetí strany. Úvodní informace o IMiddlewareFactory
aktivaci middlewaru založeného na továrně v ASP.NET Core najdete IMiddleware
v tématu o aktivaci middlewaru založeného na továrně.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Ukázková aplikace demonstruje aktivaci middlewaru implementací IMiddlewareFactory
, SimpleInjectorMiddlewareFactory
. Ukázka používá kontejner DI (Simple Injector dependency injection).
Implementace middlewaru ukázky zaznamenává hodnotu zadanou parametrem řetězce dotazu (key
). Middleware používá vložený kontext databáze (službu s vymezeným oborem) k zaznamenání hodnoty řetězce dotazu v databázi v paměti.
Poznámka:
Ukázková aplikace používá jednoduchý injektor čistě pro demonstrační účely. Použití jednoduchého injektoru není doporučení. Přístupy k aktivaci middlewaru popsané v dokumentaci k simple injectoru a problémy s GitHubem se doporučují správci jednoduchého injektoru. Další informace najdete v dokumentaci k simple injectoru a úložišti Simple Injector Na GitHubu.
IMiddlewareFactory
IMiddlewareFactory poskytuje metody pro vytvoření middlewaru.
V ukázkové aplikaci se k vytvoření SimpleInjectorActivatedMiddleware
instance implementuje middlewarová továrna. Middleware factory používá k překladu middlewaru kontejner 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 definuje middleware pro kanál žádosti aplikace.
Middleware aktivovaný implementací 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);
}
}
Vytvoří se rozšíření pro middleware (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
musí provádět několik úloh:
- Nastavte kontejner Simple Injector.
- Zaregistrujte továrnu a middleware.
- Zpřístupněte kontext databáze aplikace z kontejneru 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();
}
Middleware je zaregistrovaný v kanálu zpracování požadavků v Startup.Configure
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}