gpt4 book ai didi

c# - 通过 SignalR Core 访问数据库上下文

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:24 25 4
gpt4 key购买 nike

我正在使用 AspNetCore.SignalR,我需要有关如何通过 Hub 访问 SQL Server 数据库的建议。关于这方面的资源并不多。我知道如何添加单例,但我不知道以后如何访问它。如何访问在我的集线器任务中的 Startup.cs 中使用 Configuration.GetConnectionString 定义的数据库上下文?

谢谢。

相关代码如下:

启动.cs

public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});


services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

DbContextOptionsBuilder<PlayerContext> PlayerContextOptions = new DbContextOptionsBuilder<PlayerContext>();
PlayerContextOptions.UseSqlServer(Configuration.GetConnectionString("Default"));
services.AddSingleton(PlayerContextOptions.Options);

services.AddDbContext<PlayerContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));



services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyMethod().AllowAnyHeader()
.AllowCredentials();
}));

services.AddSignalR();
}

但我根本不知道要在我的 Hub 文件中做什么。我什至不知道从哪里开始。我添加了单例,但我不知道如何在我的中心文件中访问它。这是我想做的,但我愿意接受更好的方法:

MyHub.cs

using (PlayerContext dbContext = new PlayerContext(/* Singleton needs to go here */))
{
// do database stuff
}

最佳答案

使用 SignalR hub 上的依赖项注入(inject)来注入(inject) EF DbContext 是错误的选择,因为 SignalR hub 本身是一个单例,不应该具有较低生命周期的依赖项,您最终会收到警告。这意味着,您不能将 DbContext 注册到 PerRequest/Transient 生命周期范围,只能使用单例。将 DbContext 注册为 Singleton 是一个非常糟糕的选择。创建新的上下文并不昂贵,但您的具有单例上下文的集线器会在一段时间后呈指数级增长。

我建议对 Hub 类使用 DbContextFactory,在你的 hub 中从工厂请求新的 DbContext 并将其放入 using 语句。您还可以将工厂本身注册为单例,并使集线器构造函数中的依赖关系更加清晰。

using (var dbContextScope = dbContextScopeFactory.Create(options))
{
//do database stuff
dbContextScope.SaveChanges();
}

关于c# - 通过 SignalR Core 访问数据库上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50885626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com