Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Note
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Warning
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Este artigo demonstra como usar IMiddlewareFactory e IMiddleware como um ponto de extensibilidade para ativação de middleware com um contêiner de terceiros. Para obter informações introdutórias sobre IMiddlewareFactory e IMiddleware, consulte Ativação de middleware baseada em fábrica no ASP.NET Core.
Visualizar ou descarregar amostra de código (como descarregar)
A aplicação de exemplo demonstra a ativação do middleware através de uma implementação IMiddlewareFactory, SimpleInjectorMiddlewareFactory. A amostra usa o contêiner de injeção de dependência (DI) Simple Injector.
A implementação de middleware do exemplo registra o valor fornecido por um parâmetro de cadeia de caracteres de consulta (key). O middleware usa um contexto de banco de dados injetado (um serviço com escopo) para registrar o valor da cadeia de caracteres de consulta em um banco de dados na memória.
Note
O aplicativo de exemplo usa o Simple Injetor puramente para fins de demonstração. O uso do Simple Injetor não é um endosso. As abordagens de ativação de middleware descritas na documentação do Simple Injector e os tópicos do GitHub são recomendados pelos mantenedores do Simple Injector. Para obter mais informações, consulte a documentação do Simple Injetor e o repositório GitHub do Simple Injetor.
IMiddlewareFactory
IMiddlewareFactory Fornece métodos para criar middleware.
No aplicativo de exemplo, uma fábrica de middleware é implementada para criar uma SimpleInjectorActivatedMiddleware instância. A fábrica de middleware usa o contêiner Simple Injetor para resolver o middleware:
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 Define middleware para o pipeline de solicitação do aplicativo.
Middleware ativado por uma IMiddlewareFactory implementação (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);
}
}
Uma extensão é criada para o middleware (Middleware/MiddlewareExtensions.cs):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices deve executar várias tarefas:
- Configure o recipiente do Injetor Simples.
- Registe a fábrica e o middleware.
- Disponibilize o contexto do banco de dados do aplicativo no contêiner do Simple Injetor.
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();
}
O middleware é registrado no pipeline de processamento de solicitações em 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();
});
}
Este artigo demonstra como usar IMiddlewareFactory e IMiddleware como um ponto de extensibilidade para ativação de middleware com um contêiner de terceiros. Para obter informações introdutórias sobre IMiddlewareFactory e IMiddleware, consulte Ativação de middleware baseada em fábrica no ASP.NET Core.
Visualizar ou descarregar amostra de código (como descarregar)
A aplicação de exemplo demonstra a ativação do middleware através de uma implementação IMiddlewareFactory, SimpleInjectorMiddlewareFactory. A amostra usa o contêiner de injeção de dependência (DI) Simple Injector.
A implementação de middleware do exemplo registra o valor fornecido por um parâmetro de cadeia de caracteres de consulta (key). O middleware usa um contexto de banco de dados injetado (um serviço com escopo) para registrar o valor da cadeia de caracteres de consulta em um banco de dados na memória.
Note
O aplicativo de exemplo usa o Simple Injetor puramente para fins de demonstração. O uso do Simple Injetor não é um endosso. As abordagens de ativação de middleware descritas na documentação do Simple Injector e os tópicos do GitHub são recomendados pelos mantenedores do Simple Injector. Para obter mais informações, consulte a documentação do Simple Injetor e o repositório GitHub do Simple Injetor.
IMiddlewareFactory
IMiddlewareFactory Fornece métodos para criar middleware.
No aplicativo de exemplo, uma fábrica de middleware é implementada para criar uma SimpleInjectorActivatedMiddleware instância. A fábrica de middleware usa o contêiner Simple Injetor para resolver o middleware:
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 Define middleware para o pipeline de solicitação do aplicativo.
Middleware ativado por uma IMiddlewareFactory implementação (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);
}
}
Uma extensão é criada para o middleware (Middleware/MiddlewareExtensions.cs):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices deve executar várias tarefas:
- Configure o recipiente do Injetor Simples.
- Registe a fábrica e o middleware.
- Disponibilize o contexto do banco de dados do aplicativo no contêiner do Simple Injetor.
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();
}
O middleware é registrado no pipeline de processamento de solicitações em Startup.Configure:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}