我有两项服务。
services.AddControllers();
和
services.AddSignalR()
.AddHubOptions<OutputMessages>(options =>
{
options.EnableDetailedErrors = true;
});
services.AddScoped<IOutputMessages, OutputMessages>();
第二个服务也已配置:
app.UseEndpoints(endpoints =>
endpoints.MapHub<OutputMessages>("/OutputMessages", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
我的 SignalR 服务有接口:
public interface ISignalRHandler
{
public void RestartProcessor(Guid containerId, string userId, string message);
....
}
我在我的SignalR服务实现中继承了这个接口和SignalR接口
public class OutputMessages : Hub, IOutputMessages
{
public OutputMessages(IHubContext<OutputHub> hubContext, ILogger<OutputMessages> logger, ApplicationDbContext dbContext)
{
_hubContext = hubContext;
_db = dbContext;
_logger = logger;
}
public void SendUserMessage(string discordId, Guid containerId, string message)
....
}
我尝试将我的 SignalR 服务注入控制器服务:
public class ApplicationAPIController : ControllerBase
{
public ApplicationAPIController(ILogger<ApplicationAPIController> logger, ApplicationDbContext dbContext, IConfiguration Configuration, CoreObjectDumper.CoreObjectDumper dump, OutputMessages _outputMessages)
{
但是收到错误消息
尝试激活“ApplicationAPIController”时无法解析“SignalR.OutputMessages”类型的服务。
如何解决这个问题?
您不需要将 OutputMessages 添加为瞬态,因为在映射集线器并添加/使用信号器时您已经这样做了。
app.UseSignalR(routes =>
{
routes.MapHub<OutputMessages>("/OutputMessages");
});
那么当你注入控制器时,建议注入HubContext,而不是集线器本身。
示例:
private IHubContext<NotificationsHub, INotificationsHub> NotificationsHub
{
get
{
return this.serviceProvider.GetRequiredService<IHubContext<NotificationsHub, INotificationsHub>>();
}
}
或者根据您的情况:
public ApplicationAPIController(ILogger<ApplicationAPIController> logger, ApplicationDbContext dbContext, IConfiguration Configuration, CoreObjectDumper.CoreObjectDumper dump, IHubContext<OutputMessages, IOutputMessages> _outputMessages)
您通常不应该从 DI 中解析 Hub。如果您需要在 Hub 和其他组件之间共享代码,我建议使用 IHubContext 或将共享代码放在单独的 DI 服务中。