- 为了能够在
Domain.Core 和 App 项目中使用 Hub,我应该如何将其全部连接起来?
领域层:
-
IMyNotifier接口
-
NullMyNotifier null 实现
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);
}
}
网页层:
- SignalR 集线器实现,例如
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);
}
}
}
使用,在任何引用领域层的层中:
public class MyDomainService : DomainService, IMyManager
{
public IMyNotifier MyNotifier { get; set; }
public MyDomainService()
{
MyNotifier = NullMyNotifier.Instance;
}
public async Task DoSomething()
{
// Do something
// ...
var hostAdmin = new UserIdentifier(null, 1);
var message = "Something done";
await MyNotifier.SendMessage(hostAdmin, message);
}
}
- 我能否将整个 SignalR 集线器移动到新模块并从应用、域和 Web 层引用它?
您可以,但是包含 SignalR 集线器(以及您的应用程序和域层)的新模块将依赖于 Microsoft.AspNetCore.SignalR,而 Microsoft.AspNetCore.SignalR 又依赖于 Microsoft.AspNetCore.Http.Connections。域层不应依赖Http。