ASP.NET Core'da üçüncü taraf bir kapsayıcıyla ara yazılım etkinleştirmesi

Bu makalede, üçüncü taraf kapsayıcı ile ara yazılım etkinleştirmesi için genişletilebilirlik noktası olarak ve'nin IMiddleware nasıl kullanılacağı IMiddlewareFactory gösterilmektedir. ve ile ilgili IMiddlewareFactory giriş bilgileri için bkz. ASP.NET Core'da fabrika tabanlı ara yazılım IMiddlewareetkinleştirme.

Örnek kodu görüntüleme veya indirme (indirme)

Örnek uygulama, bir IMiddlewareFactory uygulama SimpleInjectorMiddlewareFactoryolan ara yazılım etkinleştirmesini gösterir. Örnek, Basit Enjektör bağımlılık ekleme (DI) kapsayıcısını kullanır.

Örneğin ara yazılım uygulaması, sorgu dizesi parametresi (key) tarafından sağlanan değeri kaydeder. Ara yazılım, sorgu dizesi değerini bellek içi veritabanına kaydetmek için eklenen veritabanı bağlamını (kapsamlı bir hizmet) kullanır.

Dekont

Örnek uygulama yalnızca tanıtım amacıyla Basit Enjektör kullanır. Basit Enjektör kullanımı bir onay değildir. Basit Enjektör belgelerinde açıklanan ara yazılım etkinleştirme yaklaşımları ve GitHub sorunları, Basit Enjektör'ün bakımcıları tarafından önerilir. Daha fazla bilgi için Basit Enjektör belgelerine ve Basit Enjektör GitHub deposuna bakın.

IMiddlewareFactory

IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar.

Örnek uygulamada, örnek SimpleInjectorActivatedMiddleware oluşturmak için bir ara yazılım fabrikası uygulanır. Ara yazılım fabrikası, ara yazılımı çözmek için Basit Enjektör kapsayıcısını kullanır:

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 uygulamanın istek işlem hattı için ara yazılımı tanımlar.

Bir IMiddlewareFactory uygulama tarafından etkinleştirilen ara yazılım (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);
    }
}

Ara yazılımMiddleware/MiddlewareExtensions.cs () için bir uzantı oluşturulur:

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

Startup.ConfigureServices birkaç görev gerçekleştirmelidir:

  • Basit Enjektör kapsayıcısını ayarlayın.
  • Fabrikayı ve ara yazılımı kaydedin.
  • Uygulamanın veritabanı bağlamını Basit Enjektör kapsayıcısından kullanılabilir hale getirin.
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();
}

Ara yazılım, içindeki istek işleme işlem hattına Startup.Configurekaydedilir:

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();
    });
}

Bu makalede, üçüncü taraf kapsayıcı ile ara yazılım etkinleştirmesi için genişletilebilirlik noktası olarak ve'nin IMiddleware nasıl kullanılacağı IMiddlewareFactory gösterilmektedir. ve ile ilgili IMiddlewareFactory giriş bilgileri için bkz. ASP.NET Core'da fabrika tabanlı ara yazılım IMiddlewareetkinleştirme.

Örnek kodu görüntüleme veya indirme (indirme)

Örnek uygulama, bir IMiddlewareFactory uygulama SimpleInjectorMiddlewareFactoryolan ara yazılım etkinleştirmesini gösterir. Örnek, Basit Enjektör bağımlılık ekleme (DI) kapsayıcısını kullanır.

Örneğin ara yazılım uygulaması, sorgu dizesi parametresi (key) tarafından sağlanan değeri kaydeder. Ara yazılım, sorgu dizesi değerini bellek içi veritabanına kaydetmek için eklenen veritabanı bağlamını (kapsamlı bir hizmet) kullanır.

Dekont

Örnek uygulama yalnızca tanıtım amacıyla Basit Enjektör kullanır. Basit Enjektör kullanımı bir onay değildir. Basit Enjektör belgelerinde açıklanan ara yazılım etkinleştirme yaklaşımları ve GitHub sorunları, Basit Enjektör'ün bakımcıları tarafından önerilir. Daha fazla bilgi için Basit Enjektör belgelerine ve Basit Enjektör GitHub deposuna bakın.

IMiddlewareFactory

IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar.

Örnek uygulamada, örnek SimpleInjectorActivatedMiddleware oluşturmak için bir ara yazılım fabrikası uygulanır. Ara yazılım fabrikası, ara yazılımı çözmek için Basit Enjektör kapsayıcısını kullanır:

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 uygulamanın istek işlem hattı için ara yazılımı tanımlar.

Bir IMiddlewareFactory uygulama tarafından etkinleştirilen ara yazılım (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);
    }
}

Ara yazılımMiddleware/MiddlewareExtensions.cs () için bir uzantı oluşturulur:

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

Startup.ConfigureServices birkaç görev gerçekleştirmelidir:

  • Basit Enjektör kapsayıcısını ayarlayın.
  • Fabrikayı ve ara yazılımı kaydedin.
  • Uygulamanın veritabanı bağlamını Basit Enjektör kapsayıcısından kullanılabilir hale getirin.
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();
}

Ara yazılım, içindeki istek işleme işlem hattına Startup.Configurekaydedilir:

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

    app.UseSimpleInjectorActivatedMiddleware();

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

Ek kaynaklar