2013-04-16 75 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

請勿張貼代碼截圖。將代碼作爲文本發佈。 –