c# - 从存储库项目调用信号器集线器方法
问题描述
我有一个 webapi 项目,我在其中配置了 SignalR 集线器。我可以从 api 项目中向客户端发送消息,但我必须从存储库项目中发送消息。
MyAAPIProject > 控制器:
[HttpGet]
[Route("test")]
public IHttpActionResult UpdateEmployees()
{
_empRepo.Update();
// This is working fine =>
// MessageHub hub = new MessageHub();
// hub.SendMessage("something");
}
MyAPIProject > SignalR 集线器:
namespace MyAPIProject.Hubs
{
public class MessageHub : Hub
{
public async void SendMessage(MessageDto p, string connectionId)
{
await Context.Clients.Client(connectionId).OnProgress(p);
}
}
}
我在 WebApi 项目中添加了 SignalRHub,因为根据文档,我们需要在 OWIN Startup 类中配置信号器,它只能在 Web 项目(如我的 webapi 项目)中调用,而不能在类库(如我的存储库项目)中调用。
MyAPIProject > 启动:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapAzureSignalR(this.GetType().FullName);
}
}
RepositoryProject > EmpRepo:
public void Update()
{
<<some task>>
// This is what I want to do =>
// MessageHub hub = new MessageHub();
// hub.SendMessage("something");
<<some task>>
}
基本上,从我的 webapi 控制器方法中,我调用了一个存储库(单独的项目)方法,该方法执行整个任务并且必须定期发送任务进度。为了使用 SignalRHub 发送消息,我必须从存储库中引用 webapi 项目。
但我担心这会产生循环依赖。
谁能建议我如何在没有循环依赖的情况下实现此功能?
解决方案
听起来您需要使用Microsoft.AspNet.SignalR.Client
. 您可以从 nuget 添加它。
假设您的 SignlaR 集线器实现了一个NotifyUpdateMethod
. 作为一个简化的示例,您可以创建一个信使服务。
public class MessengerService : IDisposable
{
private readonly HubConnection hubConnection;
private readonly IHubProxy hubProxy;
public MessengerService(HubConnection hubConnection)
{
this.hubConnection = hubConnection ?? throw new ArgumentNullException(nameof(hubConnection));
hubProxy = hubConnection.CreateHubProxy(HubName);
}
public void Connect()
{
hubConnection.Start().Wait();
}
public void NotifyUpdate(int id)
{
hubProxy.Invoke(NotifyUpdateMethod, id);
}
}
}
您可以创建此服务的实例以连接到集线器并发送消息。