更改 ASP.NET 中间件中的 DbContext
Change DbContext in ASP.NET Middleware
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
本例中实现了自定义中间件。我想根据我在此中间件中的操作更改 DbContext。我可以添加一个将被注入的 DbContext 参数,然后用它做我需要做的事情:
public async Task InvokeAsync(HttpContext context, MyDbContext context)
{
context.Database.GetDbConnection().ConnectionString = "..."; // +
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
但是,我将如何传播新的 DbContext?
您必须像这样在 ConfigureServices
中注册您的 DbContext
:
services.AddScoped<MyDbContext>(sp=> {
var httpContextAccessor = sp.GetRequiredService<IHttpContextAccessor>();
var httpContext = httpContextAccessor.HttpContext;
var request = httpContext.Request;
// form your connection string here based on data
// from the request and pass it down to DbContext constructor
var connString = "...";
return new MyDbContext(connString);
});
您还必须添加 services.AddHttpContextAccessor()
才能正常工作。
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
本例中实现了自定义中间件。我想根据我在此中间件中的操作更改 DbContext。我可以添加一个将被注入的 DbContext 参数,然后用它做我需要做的事情:
public async Task InvokeAsync(HttpContext context, MyDbContext context)
{
context.Database.GetDbConnection().ConnectionString = "..."; // +
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
但是,我将如何传播新的 DbContext?
您必须像这样在 ConfigureServices
中注册您的 DbContext
:
services.AddScoped<MyDbContext>(sp=> {
var httpContextAccessor = sp.GetRequiredService<IHttpContextAccessor>();
var httpContext = httpContextAccessor.HttpContext;
var request = httpContext.Request;
// form your connection string here based on data
// from the request and pass it down to DbContext constructor
var connString = "...";
return new MyDbContext(connString);
});
您还必须添加 services.AddHttpContextAccessor()
才能正常工作。