在 SignalR hub 中注入单例作用域依赖
Injecting singleton scoped dependency in SignalR hub
我正在使用 Microsoft.AspNetCore.SignalR (1.1.0)
我在startup.cs
有一些服务:
services.AddSingleton<IHostedService, MySingletonService>();
services.AddScoped<MyScopedService >();
现在我想在我的中心使用这个服务,所以我注入它:
private readonly MyScopedService _cs;
private readonly MySingletonService _ss;
public MyHub(MyScopedService cs, MySingletonService ss)
{
_cs = cs;
_ss= ss;
}
这仅适用于作用域服务,一旦服务是单例的,集线器就永远不会被调用,也无法在浏览器中连接。为什么这不可能?我只是想要单例服务的现有实例,调用一个方法然后再放手。
这与SignalR无关。由于我将服务创建为 IHostedService
,因此我还需要将其作为 IHostedService
注入,这是不可能的,因为我有多个 IHostedServices
并且只想要这个特定的。解决办法就是像普通单例一样注入,然后启动。
services.AddSingleton<MySingletonService>();
//Start the background services
services.AddHostedService<BackgroundServiceStarter<MySingletonService>>();
我在这里找到了解决方案:
我正在使用 Microsoft.AspNetCore.SignalR (1.1.0)
我在startup.cs
有一些服务:
services.AddSingleton<IHostedService, MySingletonService>();
services.AddScoped<MyScopedService >();
现在我想在我的中心使用这个服务,所以我注入它:
private readonly MyScopedService _cs;
private readonly MySingletonService _ss;
public MyHub(MyScopedService cs, MySingletonService ss)
{
_cs = cs;
_ss= ss;
}
这仅适用于作用域服务,一旦服务是单例的,集线器就永远不会被调用,也无法在浏览器中连接。为什么这不可能?我只是想要单例服务的现有实例,调用一个方法然后再放手。
这与SignalR无关。由于我将服务创建为 IHostedService
,因此我还需要将其作为 IHostedService
注入,这是不可能的,因为我有多个 IHostedServices
并且只想要这个特定的。解决办法就是像普通单例一样注入,然后启动。
services.AddSingleton<MySingletonService>();
//Start the background services
services.AddHostedService<BackgroundServiceStarter<MySingletonService>>();
我在这里找到了解决方案: