【问题标题】:SignalR combined with BreezeSignalR 与 Breeze 结合
【发布时间】:2014-08-05 08:09:01
【问题描述】:

我现在已经使用 BreezeJS 建立了一个项目。 不知道 BreezeJS 内部发生了什么,但只是接受它可以工作,我的项目基本上是通过这个简单的命令显示在屏幕上的。

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

我现在想让它对使用 signalR 编辑相同项目的用户做出响应。 这意味着我此时在 javascript 结束时触发了回调,说明 guid = xxxxxxx 的对象已更改(guid 是关键)。

如何在不再次查询服务器的情况下使用 Breeze 更新项目,也不将其视为需要发送回服务器的更新。记住我刚刚从信号 r 那里得到了更新。

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

【问题讨论】:

    标签: javascript signalr breeze


    【解决方案1】:

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

    我目前的想法是 SignalR 适合通知客户感兴趣的数据发生更改,但我不会将更改的数据传递给客户SignalR。我让客户端决定是否(或不......或何时)从服务器获取更改的数据。

    我的推理基于这样一种观点,即 SignalR 应该是一种快速、轻量级的通知机制,而不是向可能或可能尚未准备好(或愿意)应对巨大强加给他们的大量变更数据。

    也许您可以详细说明为什么您的想法不同。我当然愿意接受另一种观点。

    【讨论】:

    • 首先,这将是简单和快速的开发。只需将其从信号器连接起来即可推送数据。但是您绝对正确,让客户决定何时获取实际数据可能会更好。我会考虑更多,如果我改变主意,我的第一个想法比你的好,那么我会告诉你:)
    • 我不得不说,随着 CQRS 的兴起,这种观点并不是唯一正确的观点。如果我向我的服务器发出 get 命令,最终向我发送事件/或完整读取模型,那么 signalr 是一个很好的异步事件和对象传递机制。
    • 实际上,这将是一个很棒的功能,原因与微风变更集的原因相同 - 最大限度地减少服务器的 roudrip 数量。如果您只使用 signalr 进行通知(也不是免费的),您仍然需要通过 web api/odata 获取您的客户感兴趣的所有更改的对象,并且在非平凡的情况下,它需要多个请求或专用方法来获取一口气的变化又不能灵活/通用。我的观点是——如果有一种方法可以(可选地)将变更集不仅传播到服务器,还传播到订阅的客户端。
    【解决方案2】:

    我完全同意沃德·贝尔的观点

    如果你想知道怎么做:例如在一个 Angular Application 中,你可以订阅这样的微风实体跟踪机制

    然后您可以在其他地方设置一个 SignlarR Hub 以将这些更改传输给所有客户端

    由于微风.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);
                }
            });
        }
    

    【讨论】:

    • 请勿发布代码截图。将代码作为文本发布。
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 2013-09-23
    • 2012-11-21
    • 1970-01-01
    • 2014-05-17
    • 2017-09-13
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多