尝试激活“YYYYAPIController”时无法解析类型“SignalR.XXXX”的服务

问题描述 投票:0回答:1

我有两项服务。

        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”类型的服务。

如何解决这个问题?

asp.net-core dependency-injection asp.net-core-mvc signalr
1个回答
2
投票

您不需要将 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 服务中。

© www.soinside.com 2019 - 2024. All rights reserved.