2013-04-16 42 views
8

我有一个项目,我现在已经与BreezeJS建立。 不知道BreezeJS里面发生了什么,只是接受了它的工作原理,基本上我从屏幕上显示了这些简单的命令。SignalR结合微风

export function getProjects(projectsObservable, errorObservable) 
{ 
return breeze.EntityQuery.from("Projects") 
     .using(manager).execute()...then/fail. 
} 

我现在想让它对使用signalR编辑相同项目的用户做出响应。 这意味着我在这一点上有回调被发射在JavaScript结束说,与guid = xxxxxxx对象已经改变(GUID是关键)。

如何在无需再次查询服务器的情况下点击进入Breeze更新项目,也不会将其视为需要发送回服务器的更新。 Remmeber,我刚从信号r得到更新。

我应该在第一个地方采取了另一个路径,是否有理由创建一个WebApi,如果我可以在开始时从signalR集线器返回数据?用Breeze而不是WebApi来设置它会很容易吗?

回答

12

我们IdeaBlade期待为使用SignalR的Breeze应用程序提供良好的指导。

我现在的想法是,SignalR适合通知变化感兴趣的数据的客户端,但我不会与SignalR改变的数据传送给客户端。我让客户决定是否(或不是)或何时从服务器获取已更改的数据。

我的推理是基于这样一种观点,即SignalR应该是一种快速,轻量级的通知机制,而不是在订阅客户端喷洒大量数据的消防软管,他们可能或可能不准备(或愿意)数量庞大的变更数据被强加于他们。

也许你可以详细说明为什么你有不同的想法。我非常乐于接受另一种观点。

+0

首先,这将是简单和快速的发展。只需将其与信号器连接即可推送数据。但是你是绝对正确的,让客户决定何时获得实际数据可能会更好。我会觉得多一点关于它,如果我改变了主意,我的第一个想法是更好的比你的话,我会让你知道:) –

+0

我有CQRS的兴起这种观点是不唯一正确观点的话。如果我正在向我的服务器发出获取命令(最终向我发送事件/或完整读取模型),那么signalr是一个出色的异步事件和对象传递机制。 – Damian

+0

事实上,这将是一个伟大的功能,同样的原因微风变更是 - 最小化到服务器roudrips的数量。如果你只使用通知(其心不是免费要么)signalr你仍然需要获取所有更改的对象客户兴趣通过网络API/OData的和在平凡的情况下,它可能需要几个要么请求或获取专用方法一次性的变化反过来又不能灵活/通用。我的观点是 - 有一种方法可以(可选地)将更改集不仅传播到服务器,而且还传播到订阅客户端。 –

4

我完全沃德贝尔

同意如果你想知道如何做到这一点:例如在角应用程序,你可以订阅清风这样

enter image description here

实体跟踪机制然后,您可以在其他地方设置SignlarR集线器将这些更改传输到所有客户端

但是可能要感谢bree的力量ze.js,我不会推荐它,因为正如沃德指出的那样:“这将是一个喷洒大量数据的订阅客户的消防软管”。想一想,并考虑你的应用程序将有嗯,让我们说30个并发用户进行交易,想象所有将创建的网络流量。这将是糟糕的软件架构。

您可能会考虑这样做的唯一原因是,如果您需要更新从实时数据提供的仪表板,但您仍然需要特别精确,注意,意识到数据流量和服务器利用率。

function setupEventForHasChangesChanged() { 
     EntityManager.hasChangesChanged.subscribe(function (eventArgs) { 
      $rootScope.$emit('dataservice.hasChangesChanged', eventArgs); 
     }); 
    } 

    function setupEventForEntitiesChanged() { 
     EntityManager.entityChanged.subscribe(function (changeArgs) { 
      if (changeArgs.entityAction === breeze.EntityAction.PropertyChange) { 
       $rootScope.$emit('dataservice.entitiesChanged', changeArgs); 
      } 
     }); 
    } 
+2

请勿张贴代码截图。将代码作为文本发布。 –