各种在线示例显示了将DbContext注入到服务构造函数中的gRPC服务中:
public ImageStorageService(ILogger<ImageStorageService> logger, SqliteDbContext dbContext)
{
_logger = logger;
_dbContext = dbContext;
}
,并在所有gRPC实现方法中使用该_dbContext。这似乎不太正确-我是EF和.Net Core网站的新手,但DbContext不是线程安全的,可以同时执行多个gRPC方法,是吗?
无论如何,我找到了另一种方法,这是构造函数和示例api方法实现:
public ImageStorageService(ILogger<ImageStorageService> logger, IServiceScopeFactory serviceScopeFactory)
{
_logger = logger;
_serviceScopeFactory = serviceScopeFactory;
}
public override async Task<GetImageCountReply> GetImageCount(GetImageCountRequest request, ServerCallContext context)
{
using var scope = _serviceScopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<SqliteDbContext>();
var count = await dbContext.StoredImages.CountAsync(context.CancellationToken);
return new GetImageCountReply { Count = count };
}
我是否使事情复杂化了? services.AddDbContext <>注入具有作用域生存期的数据库上下文,所以这是必须的,不是吗?