首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从存储库项目中调用signalr集线器方法

从存储库项目中调用signalr集线器方法
EN

Stack Overflow用户
提问于 2020-10-15 01:47:12
回答 1查看 255关注 0票数 0

我有一个webapi项目,我已经配置了SignalR集线器。我可以从api项目中向客户端发送消息,但我必须从存储库项目中发送消息。

MyAAPIProject >控制器:

代码语言:javascript
复制
[HttpGet]
[Route("test")]
public IHttpActionResult UpdateEmployees()
{
    _empRepo.Update();
    // This is working fine =>
    // MessageHub hub = new MessageHub();
    // hub.SendMessage("something");
}

MyAPIProject > SignalR集线器:

代码语言:javascript
复制
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启动类中配置signalr,该类只能在web项目(如我的webapi项目)中调用,而不能在类库(如我的存储库项目)中调用。

MyAPIProject > StartUp:

代码语言:javascript
复制
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapAzureSignalR(this.GetType().FullName);
    }
}

RepositoryProject > EmpRepo:

代码语言:javascript
复制
public void Update()
{
    <<some task>>
    // This is what I want to do =>
    // MessageHub hub = new MessageHub();
    // hub.SendMessage("something");
    <<some task>>
}

基本上,从我的webapi控制器方法中,我调用了一个仓库(单独的项目)方法,该方法完成整个任务,并且必须定期发送任务进度。为了使用SignalRHub发送消息,我必须从存储库引用webapi项目。

但我担心这会造成循环依赖。

有没有人可以建议我如何在没有循环依赖的情况下实现这个功能?

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 02:05:33

听起来您需要使用Microsoft.AspNet.SignalR.Client实现一个SignalR client。您可以从nuget添加此内容。

假设您的SignlaR集线器实现了一个NotifyUpdateMethod。作为一个简化的示例,您可以创建一个messenger服务。

代码语言:javascript
复制
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);
        }
    }
}

您可以创建此服务的实例以连接到集线器并发送消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64358834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档