ASP.NET Core'de üçüncü taraf kapsayıcı ile ara yazılım etkinleştirme
Bu makalede, üçüncü taraf kapsayıcı ile ara yazılım etkinleştirmesi için ve genişletilebilirlik noktası olarak IMiddlewareFactory IMiddleware nasıl kullanabileceğiniz açıklanmıştır. ve hakkında giriş bilgileri IMiddlewareFactory için IMiddleware bkz. ASP.NET Core 'de fabrika tabanlı ara yazılım etkinleştirmesi .
Örnek kodu görüntüleme veya indirme ( nasılindir)
Örnek uygulama, bir uygulama tarafından ara yazılım IMiddlewareFactory etkinleştirmeyi SimpleInjectorMiddlewareFactory gösteriyor. Örnek, Basit Enjektör bağımlılık ekleme (DI) kapsayıcısı kullanır.
Örneğin ara yazılım uygulaması, sorgu dizesi parametresi () tarafından sağlanan değeri key kaydedmiştir. Ara yazılım, sorgu dizesi değerini bellek içinde bir veritabanına kaydetmek için bir veritabanı bağlamı (kapsamlı hizmet) kullanır.
Not
Örnek uygulama, basit ekleyiciyi yalnızca tanıtım amacıyla kullanır. Basit Ekleme'nin 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 bakımcılar tarafından önerilir. Daha fazla bilgi için, Simple Injector belgelerine ve Simple Injector GitHub deposuna bakın.
IMiwareFactory
IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar.
Örnek uygulamada örnek oluşturmak için bir ara yazılım fabrikası SimpleInjectorActivatedMiddleware uygulanır. Ara yazılım fabrikası, ara yazılımı çözümlemek için Simple Injector 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.
}
}
IMiware
IMiddleware uygulamanın istek işlem hattı için ara yazılımı tanımlar.
Bir uygulama tarafından etkinleştirilen IMiddlewareFactory ara yazılım ( Ara Yazılım/SimpleInjectorActivatedMiware.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ım için bir uzantı oluşturulur (Ara Yazılım/Ara YazılımExtensions.cs):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices birkaç görev gerçekleştirmesi gerekir:
- Simple Injector kapsayıcısı ayarlayın.
- Fabrikayı ve ara yazılımı kaydetme.
- Uygulamanın veritabanı bağlamını Simple Injector kapsayıcısı ile kullanılabilir hale indirin.
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, 'de istek işleme işlem hattına Startup.Configure kaydedilir:
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 ve genişletilebilirlik noktası olarak IMiddlewareFactory IMiddleware nasıl kullanabileceğiniz açıklanmıştır. ve hakkında giriş bilgileri IMiddlewareFactory için IMiddleware bkz. ASP.NET Core 'de fabrika tabanlı ara yazılım etkinleştirmesi .
Örnek kodu görüntüleme veya indirme ( nasılindir)
Örnek uygulama, bir uygulama tarafından ara yazılım IMiddlewareFactory etkinleştirmeyi SimpleInjectorMiddlewareFactory gösteriyor. Örnek, Basit Enjektör bağımlılık ekleme (DI) kapsayıcısı kullanır.
Örneğin ara yazılım uygulaması, sorgu dizesi parametresi () tarafından sağlanan değeri key kaydedmiştir. Ara yazılım, sorgu dizesi değerini bellek içinde bir veritabanına kaydetmek için bir veritabanı bağlamı (kapsamlı hizmet) kullanır.
Not
Örnek uygulama, basit ekleyiciyi yalnızca tanıtım amacıyla kullanır. Basit Ekleme'nin 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 bakımcılar tarafından önerilir. Daha fazla bilgi için, Simple Injector belgelerine ve Simple Injector GitHub deposuna bakın.
IMiwareFactory
IMiddlewareFactory ara yazılım oluşturmak için yöntemler sağlar.
Örnek uygulamada örnek oluşturmak için bir ara yazılım fabrikası SimpleInjectorActivatedMiddleware uygulanır. Ara yazılım fabrikası, ara yazılımı çözümlemek için Simple Injector 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.
}
}
IMiware
IMiddleware uygulamanın istek işlem hattı için ara yazılımı tanımlar.
Bir uygulama tarafından etkinleştirilen IMiddlewareFactory ara yazılım ( Ara Yazılım/SimpleInjectorActivatedMiware.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ım için bir uzantı oluşturulur (Ara Yazılım/Ara YazılımExtensions.cs):
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices birkaç görev gerçekleştirmesi gerekir:
- Simple Injector kapsayıcısı ayarlayın.
- Fabrikayı ve ara yazılımı kaydetme.
- Uygulamanın veritabanı bağlamını Simple Injector kapsayıcısı ile kullanılabilir hale indirin.
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, 'de istek işleme işlem hattına Startup.Configure kaydedilir:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}