Aktywacja oprogramowania pośredniczącego przy użyciu kontenera innej firmy na platformie ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
W tym artykule pokazano, jak używać IMiddlewareFactory oprogramowania pośredniczącego i IMiddleware jako punktu rozszerzalności dla aktywacji oprogramowania pośredniczącego z kontenerem innej firmy. Aby uzyskać informacje wprowadzające na temat IMiddlewareFactory
systemów i IMiddleware
, zobacz Aktywacja oprogramowania pośredniczącego opartego na fabryce w programie ASP.NET Core.
Wyświetl lub pobierz przykładowy kod (jak pobrać)
Przykładowa aplikacja demonstruje aktywację oprogramowania pośredniczącego przez implementację IMiddlewareFactory
SimpleInjectorMiddlewareFactory
. W przykładzie użyto kontenera wstrzykiwania zależności simple injector (DI).
Implementacja oprogramowania pośredniczącego przykładu rejestruje wartość podaną przez parametr ciągu zapytania (key
). Oprogramowanie pośredniczące używa wstrzykiwanego kontekstu bazy danych (usługi o określonym zakresie) do rejestrowania wartości ciągu zapytania w bazie danych w pamięci.
Uwaga
Przykładowa aplikacja używa prostego wstrzykiwacza wyłącznie do celów demonstracyjnych. Użycie prostego wstrzykiwacza nie jest poparciem. Metody aktywacji oprogramowania pośredniczącego opisane w dokumentacji prostego wstrzykiwania i problemy z usługą GitHub są zalecane przez osoby odpowiedzialne za prosty wstrzykiwacz. Aby uzyskać więcej informacji, zobacz dokumentację Simple Injector i repozytorium GitHub Simple Injector.
IMiddlewareFactory
IMiddlewareFactory Udostępnia metody tworzenia oprogramowania pośredniczącego.
W przykładowej aplikacji zaimplementowano fabrykę oprogramowania pośredniczącego w celu utworzenia SimpleInjectorActivatedMiddleware
wystąpienia. Fabryka oprogramowania pośredniczącego używa kontenera Simple Injector do rozwiązywania problemów z oprogramowaniem pośredniczącym:
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 definiuje oprogramowanie pośredniczące dla potoku żądania aplikacji.
Oprogramowanie pośredniczące aktywowane przez implementację 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);
}
}
Rozszerzenie jest tworzone dla oprogramowania pośredniczącego (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
musi wykonywać kilka zadań:
- Skonfiguruj kontener Simple Injector.
- Zarejestruj fabrykę i oprogramowanie pośredniczące.
- Udostępnij kontekst bazy danych aplikacji z kontenera 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();
}
Oprogramowanie pośredniczące jest zarejestrowane w potoku przetwarzania żądań w programie 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();
});
}
W tym artykule pokazano, jak używać IMiddlewareFactory oprogramowania pośredniczącego i IMiddleware jako punktu rozszerzalności dla aktywacji oprogramowania pośredniczącego z kontenerem innej firmy. Aby uzyskać informacje wprowadzające na temat IMiddlewareFactory
systemów i IMiddleware
, zobacz Aktywacja oprogramowania pośredniczącego opartego na fabryce w programie ASP.NET Core.
Wyświetl lub pobierz przykładowy kod (jak pobrać)
Przykładowa aplikacja demonstruje aktywację oprogramowania pośredniczącego przez implementację IMiddlewareFactory
SimpleInjectorMiddlewareFactory
. W przykładzie użyto kontenera wstrzykiwania zależności simple injector (DI).
Implementacja oprogramowania pośredniczącego przykładu rejestruje wartość podaną przez parametr ciągu zapytania (key
). Oprogramowanie pośredniczące używa wstrzykiwanego kontekstu bazy danych (usługi o określonym zakresie) do rejestrowania wartości ciągu zapytania w bazie danych w pamięci.
Uwaga
Przykładowa aplikacja używa prostego wstrzykiwacza wyłącznie do celów demonstracyjnych. Użycie prostego wstrzykiwacza nie jest poparciem. Metody aktywacji oprogramowania pośredniczącego opisane w dokumentacji prostego wstrzykiwania i problemy z usługą GitHub są zalecane przez osoby odpowiedzialne za prosty wstrzykiwacz. Aby uzyskać więcej informacji, zobacz dokumentację Simple Injector i repozytorium GitHub Simple Injector.
IMiddlewareFactory
IMiddlewareFactory Udostępnia metody tworzenia oprogramowania pośredniczącego.
W przykładowej aplikacji zaimplementowano fabrykę oprogramowania pośredniczącego w celu utworzenia SimpleInjectorActivatedMiddleware
wystąpienia. Fabryka oprogramowania pośredniczącego używa kontenera Simple Injector do rozwiązywania problemów z oprogramowaniem pośredniczącym:
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 definiuje oprogramowanie pośredniczące dla potoku żądania aplikacji.
Oprogramowanie pośredniczące aktywowane przez implementację 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);
}
}
Rozszerzenie jest tworzone dla oprogramowania pośredniczącego (Middleware/MiddlewareExtensions.cs
):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
musi wykonywać kilka zadań:
- Skonfiguruj kontener Simple Injector.
- Zarejestruj fabrykę i oprogramowanie pośredniczące.
- Udostępnij kontekst bazy danych aplikacji z kontenera 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();
}
Oprogramowanie pośredniczące jest zarejestrowane w potoku przetwarzania żądań w programie Startup.Configure
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}