我有一个项目,我现在已经设置了BreezeJS。 不知道BreezeJS内部到底是什么,但只是接受了它的工作原理,我的屏幕上显示的项目基本上来自这个简单的命令。
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进行设置是否容易?
答案 0 :(得分:12)
我们IdeaBlade期待为使用SignalR的Breeze应用程序提供良好的指导。
我目前的想法是SignalR适合 通知 客户端感兴趣的数据更改但我不会将更改的数据传递给客户端SignalR 即可。我让客户决定是否(或不是......或何时)从服务器获取更改的数据。
我的理由是基于这样一种观点,即SignalR应该是一种快速,轻量级的通知机制,而不是消防软管在订阅客户身上喷洒大量数据,这些客户可能会或可能不会准备好(或愿意)应对巨大的数据他们强加的变化数据量。
也许你可以详细说明你为什么以不同的方式思考。我当然愿意接受另一种观点。
答案 1 :(得分:4)
我完全赞同Ward Bell
如果您想知道如何操作:例如在角度应用程序中,您可以订阅像这样的breeze实体跟踪机制
然后您可以在其他地方设置SignlarR Hub以将这些更改传输到所有客户端
然而,由于breeze.js的强大功能,我不推荐,因为正如Ward所指出的那样:“这将是一个消防软管在订阅客户端喷洒大量数据”。试想一下,并考虑你的应用程序将会让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);
}
});
}