从域服务和应用层访问SignalR

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

这与ASP.NET Boilerplate .NET Core版本中的calling a SignalR Hub from the Application Service Layer直接相关。根据解决方案,SignalR集线器实施应在Web层中完成。但是项目的依赖结构如下:

  • 应用取决于Domain.Core
  • [Web.Core取决于应用程序
  • [Web.Host取决于Web.Core

两个问题:

  1. 为了能够同时在Hub和App项目中使用Domain.Core,我应该如何将它们全部连接起来?如果我使用空模式在App层中定义接口,则可以在Web.Core中实现该接口。但是后来我不能在域服务中使用它(例如EventBus)。

  2. 我可以将整个SignalR集线器移动到新模块并从App,Domain和Web层引用它吗?

signalr-hub aspnetboilerplate asp.net-core-signalr
1个回答
0
投票

域层:

  • IMyNotifier接口
  • NullMyNotifier空实现
public interface IMyNotifier
{
    Task SendMessage(IUserIdentifier user, string message);
}

public class NullMyNotifier : IMyNotifier
{
    public static NullMyNotifier Instance { get; } = new NullMyNotifier();

    private NullMyNotifier()
    {
    }

    public Task SendMessage(IUserIdentifier user, string message)
    {
        return Task.FromResult(0);
    }
}

Web层:

  • SignalR集线器实施,例如MyChatHub
  • MyChatHub具体实现
SignalRMyNotifier

用法,在引用域层的任何层中:

public class SignalRMyNotifier : IMyNotifier, ITransientDependency
{
    private readonly IOnlineClientManager _onlineClientManager;
    private readonly IHubContext<MyChatHub> _hubContext;

    public SignalRMyNotifier(
        IOnlineClientManager onlineClientManager,
        IHubContext<MyChatHub> hubContext)
    {
        _onlineClientManager = onlineClientManager;
        _hubContext = hubContext;
    }

    public async Task SendMessage(IUserIdentifier user, string message)
    {
        var onlineClients = _onlineClientManager.GetAllByUserId(user);
        foreach (var onlineClient in onlineClients)
        {
            var signalRClient = _hubContext.Clients.Client(onlineClient.ConnectionId);
            await signalRClient.SendAsync("getMessage", message);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.