应用程序的哪个部分应该负责通知SignalR客户端?

时间:2013-05-26 21:54:57

标签: architecture ravendb signalr

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

WPF - > WCF(也是主机SignalR) - > BLL - > DAL - > RavenDB

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

  1. 添加了RavenDB文档
  2. DAL收到变更通知和火灾事件
  3. WCF订阅该事件并向所有SignalR发送消息 客户端
  4. 所有WPF客户端都会收到此通知并更新用户界面以显示此新文档
  5. 这似乎是错误的,因为我的WCF服务直接依赖于DAL。

    另一个选择是让DAL通知SignalR客户端,但那可能看起来是错误的,因为DAL不应该关注它。应该吗?

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

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

    enter image description here

3 个答案:

答案 0 :(得分:1)

您的服务无疑取决于您的BLL,而BLL又取决于DAL吗?为什么不将事件从DAL中传出,然后再通过BLL,这样就是服务订阅的BLL上的事件?

答案 1 :(得分:1)

我创建了一种让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,对不起。目前,lib是Web应用程序的目标。但是当然它也适用于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
   }
}

有关详细信息,请参阅wiki

答案 2 :(得分:0)

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