在gRPC服务实现中获取DbContext的正确方法

时间:2020-09-27 01:27:26

标签: c# entity-framework grpc

各种在线示例显示了将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 <>注入具有作用域生存期的数据库上下文,所以这是必须的,不是吗?

0 个答案:

没有答案
相关问题