这与ASP.NET Boilerplate .NET Core版本中的calling a SignalR Hub from the Application Service Layer直接相关。根据解决方案,SignalR集线器实施应在Web层中完成。但是项目的依赖结构如下:
Domain.Core
Web.Core
取决于应用程序Web.Host
取决于Web.Core
两个问题:
为了能够同时在Hub
和App项目中使用Domain.Core
,我应该如何将它们全部连接起来?如果我使用空模式在App层中定义接口,则可以在Web.Core
中实现该接口。但是后来我不能在域服务中使用它(例如EventBus
)。
我可以将整个SignalR集线器移动到新模块并从App,Domain和Web层引用它吗?
域层:
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层:
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);
}
}
}