【问题标题】:What part of an app should be responsible for notifying SignalR clients?应用程序的哪个部分应该负责通知 SignalR 客户端?
【发布时间】:2013-05-26 21:54:56
【问题描述】:

我正在使用 RavenDB,当某些文档被添加到数据库时,我的 DAL 会收到通知。整个流程如下所示:

WPF -> WCF(也托管 SignalR)-> BLL -> DAL -> RavenDB

添加文档时,会发生以下情况:

  1. 添加了 RavenDB 文档
  2. DAL 收到更改通知并触发事件
  3. WCF 订阅该事件并向所有 SignalR 发送消息 客户
  4. 所有 WPF 客户端都会收到此通知并更新 UI 以显示此新文档

这似乎是错误的,因为我的 WCF 服务直接依赖于 DAL。

另一种选择是让 DAL 通知 SignalR 客户端,但这似乎是错误的,因为 DAL 不应该关心这一点。应该吗?

整个应用程序的哪个部分应该负责实际使用 SignalR 通知所有连接的客户端?

需要明确的是,我遇到困难的部分是下面的红线 (#2)。我很难让 WCF 服务依赖于 DAL。

【问题讨论】:

    标签: architecture ravendb signalr


    【解决方案1】:

    您的服务无疑取决于您的 BLL,而 BLL 又取决于 DAL,对吧?为什么不将事件从 DAL 中路由出去,然后通过 BLL,以便服务订阅 BLL 上的事件?

    【讨论】:

    • 谢谢,马克。我想到了这一点,但我不知道在 BLL 中创建另一个事件以报告 DAL 中的事件是什么感觉。不过这可能是要走的路,所以我的服务不依赖于数据实现。
    • 其实我可能有更好的主意。为什么要涉及 WCF 服务?我只需要将整个责任从 WCF 服务转移到 BLL。 BLL 将订阅 DAL 事件,并且 BLL 将调用 SignalR。完毕。在这个过程中不需要 WCF。
    【解决方案2】:

    我创建了一种让 SignalR 更新客户端的解耦方式,我的库位于 nuget 安装使用

    Install-Package SignalR.EventAggregatorProxy 
    

    维基:https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

    该框架需要一个服务总线或“EventAggregator”才能工作,我没有为特定的服务总线或事件聚合器硬编码它,所以你必须为它创建一个代理,Caliburn micro 在进程事件聚合器中有一个轻量级的你可以安装使用

    Install-Package Caliburn.Micro.EventAggregator 
    

    然后您需要在我的库和 CM.EA 之间创建一个代理,之后在您的数据访问层发布的任何消息都会自动转发给客户端。他们可以收听诸如

    之类的事件
    signalR.eventAggregator.subscribe(MyApp.Events.TestEvent, this.onTestEvent, this);
    

    你也可以使用像

    这样的通用事件
    signalR.eventAggregator.subscribe(MyApp.Events.MyGenericEvent.of("System.String"), this.onMyGenericEvent, this);
    

    编辑: 刚刚意识到您正在为客户端使用 WPF 而不是 JS,对此感到抱歉。目前该库是针对网络应用程序的。但是当然它也应该适用于 C# 客户端,将立即将 C# 客户端支持放在路线图上!

    更新: .NET 客户端现已可用,服务器仍仅托管在 IIS 上。

    Install-Package SignalR.EventAggregatorProxy.Client.DotNet
    

    维基:https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/.NET-Client

    .NET 类可以监听这样的事件

    public class MyViewModel : IHandle<MyEvent>
    {
       public MyViewModel(IEventAggregator eventAggregator) 
       {
          eventAggregator.Subscribe(this);
       }
       public void Handle(MyEvent message)
       {
          //Act on MyEvent
       }
    }
    

    查看维基了解更多信息

    【讨论】:

    • 这看起来很有趣。谢谢,安德斯!
    【解决方案3】:

    您的工作流程对我来说似乎没问题,但我想这取决于 SignalR 多快收到通知。如果是我,我会尽快从 WCF 更新客户端。让 DAL 层负责将消息发送给所有客户端并不是正确的做法。

    【讨论】:

    • 谢谢,德里克。通知确实会立即发生。也许 WCF 服务需要依赖 DAL,但我一直认为必须有更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多