使用 SignalR 中心的服务的推荐生命周期
Recommended lifecycle for services using SignalR hubs
我正在 ASP.NET Core Web 应用程序(运行 on .NET Core 2.2)的各种控制器中使用 SignalR ContentHub 注入以下服务。目前,该服务注入了一个短暂的生命周期。使用单例生命周期会更好吗?在这种情况下,短暂的生命周期是否可能是性能问题的根源?
public class PushMessageService : IPushMessageService
{
private readonly ILogger<PushMessageService> _logger;
private readonly IHubContext<ContentHub> _context;
public PushMessageService(
ILogger<PushMessageService> logger,
IHubContext<ContentHub> context
)
{
_logger = logger;
_context = context;
}
public async Task Push(int productId)
{
var msg = new Message
{
ProductId = productId
};
await SendAsync("PushMsg", productId, msg);
}
private async Task SendAsync<TPayload>(string methodName, int productId, TPayload payload)
{
await _context.Clients.Group("prod" + productId).SendAsync(methodName, payload);
}
}
SignalR 期望为每条消息单独创建集线器。如果您希望 Hub 在 DI 中,则需要将其添加为 Transient 服务。您通常不应该从 DI 中解析 Hub。如果您需要在 Hub 和其他组件之间共享代码,我建议您使用 IHubContext
或将共享代码放在单独的 DI 服务中,就像您在此处所做的那样。所以我认为这应该是一个短暂的。
包装集线器的 IHubContext
抽象是单例。因此,使用它作为依赖项的 class 的生命周期并不重要。无论您使用单例、作用域还是瞬态生命周期,您始终会获得相同的实例。
我正在 ASP.NET Core Web 应用程序(运行 on .NET Core 2.2)的各种控制器中使用 SignalR ContentHub 注入以下服务。目前,该服务注入了一个短暂的生命周期。使用单例生命周期会更好吗?在这种情况下,短暂的生命周期是否可能是性能问题的根源?
public class PushMessageService : IPushMessageService
{
private readonly ILogger<PushMessageService> _logger;
private readonly IHubContext<ContentHub> _context;
public PushMessageService(
ILogger<PushMessageService> logger,
IHubContext<ContentHub> context
)
{
_logger = logger;
_context = context;
}
public async Task Push(int productId)
{
var msg = new Message
{
ProductId = productId
};
await SendAsync("PushMsg", productId, msg);
}
private async Task SendAsync<TPayload>(string methodName, int productId, TPayload payload)
{
await _context.Clients.Group("prod" + productId).SendAsync(methodName, payload);
}
}
SignalR 期望为每条消息单独创建集线器。如果您希望 Hub 在 DI 中,则需要将其添加为 Transient 服务。您通常不应该从 DI 中解析 Hub。如果您需要在 Hub 和其他组件之间共享代码,我建议您使用 IHubContext
或将共享代码放在单独的 DI 服务中,就像您在此处所做的那样。所以我认为这应该是一个短暂的。
包装集线器的 IHubContext
抽象是单例。因此,使用它作为依赖项的 class 的生命周期并不重要。无论您使用单例、作用域还是瞬态生命周期,您始终会获得相同的实例。