我正在使用RavenDB,当某些文档被添加到数据库时,我的DAL会收到通知。整个流程如下:
WPF - > WCF(也是主机SignalR) - > BLL - > DAL - > RavenDB
添加文档时,会发生以下情况:
这似乎是错误的,因为我的WCF服务直接依赖于DAL。
另一个选择是让DAL通知SignalR客户端,但那可能看起来是错误的,因为DAL不应该关注它。应该吗?
整个应用程序的哪一部分应负责实际使用SignalR通知所有连接的客户端?
要清楚,我遇到困难的部分是下面的红线(#2)。我很难让WCF服务依赖于DAL。
答案 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层负责将消息发送给所有客户端并不是正确的做法。