Delen via


Middlewareactivering met een container van derden in ASP.NET Core

Note

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.

Warning

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.

Important

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikel voor de huidige release.

In dit artikel wordt gedemonstreerd hoe IMiddlewareFactory en IMiddleware als uitbreidbaarheidspunten voor middleware-activering met een externe container kunnen worden gebruikt. Zie IMiddlewareFactory voor inleidende informatie over IMiddleware en.

Voorbeeldcode bekijken of downloaden (hoe download je)

De voorbeeld-app demonstreert middlewareactivering door een IMiddlewareFactory implementatie. SimpleInjectorMiddlewareFactory In het voorbeeld wordt de Simple Injector-afhankelijkheidsinjectiecontainer (DI) gebruikt.

De middleware-implementatie van het voorbeeld registreert de waarde die wordt geleverd door een querytekenreeksparameter (key). De middleware maakt gebruik van een geïnjecteerde databasecontext (een scoped service) om de waarde van de querytekenreeks in een in-memory database vast te leggen.

Note

De voorbeeld-app maakt uitsluitend gebruik van Simple Injector voor demonstratiedoeleinden. Het gebruik van Simple Injector is geen goedkeuring. Middlewareactiveringsmethoden die worden beschreven in de Simple Injector-documentatie en GitHub-problemen worden aanbevolen door de onderhouders van Simple Injector. Zie de Simple Injector-documentatie en de GitHub-opslagplaats Simple Injector voor meer informatie.

IMiddlewareFactory

IMiddlewareFactory biedt methoden voor het maken van middleware.

In de voorbeeldapp wordt een middleware-factory geïmplementeerd om een SimpleInjectorActivatedMiddleware exemplaar te maken. De middlewarefactory maakt gebruik van de Simple Injector-container om de middleware op te lossen:

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 definieert middleware voor de aanvraagpijplijn van de app.

Middleware geactiveerd door een IMiddlewareFactory implementatie (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);
    }
}

Er wordt een extensie gemaakt voor de middleware (Middleware/MiddlewareExtensions.cs):

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
    }
}

Startup.ConfigureServices moet verschillende taken uitvoeren:

  • Stel de Simple Injector-container in.
  • Registreer de fabriek en middleware.
  • Maak de databasecontext van de app beschikbaar vanuit de Simple Injector-container.
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();
}

De middleware is geregistreerd in de pijplijn voor aanvraagverwerking in 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();
    });
}

In dit artikel wordt gedemonstreerd hoe IMiddlewareFactory en IMiddleware als uitbreidbaarheidspunten voor middleware-activering met een externe container kunnen worden gebruikt. Zie IMiddlewareFactory voor inleidende informatie over IMiddleware en.

Voorbeeldcode bekijken of downloaden (hoe download je)

De voorbeeld-app demonstreert middlewareactivering door een IMiddlewareFactory implementatie. SimpleInjectorMiddlewareFactory In het voorbeeld wordt de Simple Injector-afhankelijkheidsinjectiecontainer (DI) gebruikt.

De middleware-implementatie van het voorbeeld registreert de waarde die wordt geleverd door een querytekenreeksparameter (key). De middleware maakt gebruik van een geïnjecteerde databasecontext (een scoped service) om de waarde van de querytekenreeks in een in-memory database vast te leggen.

Note

De voorbeeld-app maakt uitsluitend gebruik van Simple Injector voor demonstratiedoeleinden. Het gebruik van Simple Injector is geen goedkeuring. Middlewareactiveringsmethoden die worden beschreven in de Simple Injector-documentatie en GitHub-problemen worden aanbevolen door de onderhouders van Simple Injector. Zie de Simple Injector-documentatie en de GitHub-opslagplaats Simple Injector voor meer informatie.

IMiddlewareFactory

IMiddlewareFactory biedt methoden voor het maken van middleware.

In de voorbeeldapp wordt een middleware-factory geïmplementeerd om een SimpleInjectorActivatedMiddleware exemplaar te maken. De middlewarefactory maakt gebruik van de Simple Injector-container om de middleware op te lossen:

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 definieert middleware voor de aanvraagpijplijn van de app.

Middleware geactiveerd door een IMiddlewareFactory implementatie (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);
    }
}

Er wordt een extensie gemaakt voor de middleware (Middleware/MiddlewareExtensions.cs):

public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
    }
}

Startup.ConfigureServices moet verschillende taken uitvoeren:

  • Stel de Simple Injector-container in.
  • Registreer de fabriek en middleware.
  • Maak de databasecontext van de app beschikbaar vanuit de Simple Injector-container.
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();
}

De middleware is geregistreerd in de pijplijn voor aanvraagverwerking in Startup.Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseSimpleInjectorActivatedMiddleware();

    app.UseStaticFiles();
    app.UseMvc();
}

Aanvullende bronnen