我在C#和.NET Core中有自己的简单路由/控制器框架。我正在将EF Core用于ORM。在Startup.cs中,我将其配置如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<Context>(options =>
{
options.EnableSensitiveDataLogging();
options.UseSqlServer(System.Environment.GetEnvironmentVariable("SQL_SERVER_CONNECTION"));
});
}
我正在使用依赖注入来获取DbContext的实例。在我的控制器操作中,执行以下操作:
操作1 :
AsNoTracking()
操作2(另一个HTTP请求):
SaveChangesAsync()
动作1 中所做的更改将被保留。如果我断开了 Action 1 中的任何关系,则会收到错误消息。
我知道默认情况下DbContext是作用域的。我是否必须实现一些自己的作用域代码以确保每个HTTP请求都获得一个新实例?
注意:我不使用MVC,而是使用自己正在开发的小库。我刚刚了解到MVC可能使用IServiceScopeFactory生成范围。我不确定如何在中间件中使用它。
答案 0 :(得分:0)
我明白了。这是在中间件中使用HttpContext包装作用域的方法:
public class Middleware
{
private readonly RequestDelegate _next;
private IServiceScopeFactory _scopeFactory;
public Middleware(RequestDelegate next, IServiceScopeFactory scopeFactory)
{
_next = next;
_scopeFactory = scopeFactory;
}
public async Task Invoke(HttpContext context)
{
using (var scope = _scopeFactory.CreateScope())
{
context.RequestServices = scope.ServiceProvider;
// Do whatever you want here
if (_next != null)
await _next(context);
}
}
}