0

我正在使用 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。

在此处输入图像描述

4

3 回答 3

1

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

于 2013-05-27T13:08:12.150 回答
1

我创建了一种让 SignalR 更新客户端的解耦方式,我的库在 nuget Install 上使用

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
   }
}

有关更多信息,请参阅 wiki

于 2013-05-28T07:40:52.987 回答
0

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

于 2013-05-26T22:18:46.697 回答