Megosztás a következőn keresztül:


Köztes szoftver aktiválása külső tárolóval a ASP.NET Core-ban

Note

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Warning

A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

Ez a cikk bemutatja, hogyan használható IMiddlewareFactory és IMiddleware bővíthető pontként a köztesszoftver-aktiváláshoz egy külső tárolóval. A bevezető információkért IMiddlewareFactoryIMiddlewarelásd: Gyári alapú köztes szoftver aktiválása a ASP.NET Core-ban.

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

A mintaalkalmazás bemutatja a IMiddlewareFactory implementációval történő köztes szoftver aktiválását SimpleInjectorMiddlewareFactory. A minta a Simple Injector dependency injection (DI) tárolót használja.

A minta köztesszoftver-implementációja egy lekérdezési sztringparaméter (key) által megadott értéket rögzíti. A köztes szoftver egy injektált adatbázis-környezetet (hatókörrel rendelkező szolgáltatást) használ a lekérdezési sztring értékének rögzítéséhez egy memórián belüli adatbázisban.

Note

A mintaalkalmazás a Simple Injectort kizárólag bemutató célokra használja. Az Egyszerű injektor használata nem jóváhagyás. A Simple Injector dokumentációjában leírt köztes szoftveres aktiválási módszereket és a GitHub-problémákat a Simple Injector karbantartói javasolják. További információkért tekintse meg a Simple Injector dokumentációját és a Simple Injector GitHub-adattárat.

IMiddlewareFactory

IMiddlewareFactory metódusokat biztosít a köztes szoftver létrehozásához.

A mintaalkalmazásban egy köztesszoftver-előállító van implementálva egy SimpleInjectorActivatedMiddleware példány létrehozásához. A köztes szoftvergyár az Egyszerű injektor tárolóval oldja fel a köztes szoftvereket:

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 az alkalmazás kérési folyamatának köztes szoftverét határozza meg.

Köztes szoftver, amelyet egy implementáció aktivált 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);
    }
}

Létrejön egy bővítmény a köztes szoftverhez (Middleware/MiddlewareExtensions.cs):

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

Startup.ConfigureServices több feladatot is el kell végeznie:

  • Állítsa be az Egyszerű injektor tárolót.
  • Regisztrálja a gyárat és a köztes szoftvereket.
  • Az alkalmazás adatbázis-környezetének elérhetővé tétele az Egyszerű injektor tárolóból.
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();
}

A köztes szoftver regisztrálva van a kérelemfeldolgozási folyamatban a következő helyen 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();
    });
}

Ez a cikk bemutatja, hogyan használható IMiddlewareFactory és IMiddleware bővíthető pontként a köztesszoftver-aktiváláshoz egy külső tárolóval. A bevezető információkért IMiddlewareFactoryIMiddlewarelásd: Gyári alapú köztes szoftver aktiválása a ASP.NET Core-ban.

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

A mintaalkalmazás bemutatja a IMiddlewareFactory implementációval történő köztes szoftver aktiválását SimpleInjectorMiddlewareFactory. A minta a Simple Injector dependency injection (DI) tárolót használja.

A minta köztesszoftver-implementációja egy lekérdezési sztringparaméter (key) által megadott értéket rögzíti. A köztes szoftver egy injektált adatbázis-környezetet (hatókörrel rendelkező szolgáltatást) használ a lekérdezési sztring értékének rögzítéséhez egy memórián belüli adatbázisban.

Note

A mintaalkalmazás a Simple Injectort kizárólag bemutató célokra használja. Az Egyszerű injektor használata nem jóváhagyás. A Simple Injector dokumentációjában leírt köztes szoftveres aktiválási módszereket és a GitHub-problémákat a Simple Injector karbantartói javasolják. További információkért tekintse meg a Simple Injector dokumentációját és a Simple Injector GitHub-adattárat.

IMiddlewareFactory

IMiddlewareFactory metódusokat biztosít a köztes szoftver létrehozásához.

A mintaalkalmazásban egy köztesszoftver-előállító van implementálva egy SimpleInjectorActivatedMiddleware példány létrehozásához. A köztes szoftvergyár az Egyszerű injektor tárolóval oldja fel a köztes szoftvereket:

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 az alkalmazás kérési folyamatának köztes szoftverét határozza meg.

Köztes szoftver, amelyet egy implementáció aktivált 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);
    }
}

Létrejön egy bővítmény a köztes szoftverhez (Middleware/MiddlewareExtensions.cs):

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

Startup.ConfigureServices több feladatot is el kell végeznie:

  • Állítsa be az Egyszerű injektor tárolót.
  • Regisztrálja a gyárat és a köztes szoftvereket.
  • Az alkalmazás adatbázis-környezetének elérhetővé tétele az Egyszerű injektor tárolóból.
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();
}

A köztes szoftver regisztrálva van a kérelemfeldolgozási folyamatban a következő helyen Startup.Configure:

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

    app.UseSimpleInjectorActivatedMiddleware();

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

További erőforrások