2016-01-06 141 views
5

我們有一個Web應用程序,它由一個帶UI的3層後端(Controller/Biz/Data)組成。我們的數據層負責將數據從數據庫實例(SQL)中提取出來,業務層將消息發送到數據並創建派生屬性,控制器負責將這些更改發送到UI。三層體系結構中的SQL依賴關係和SignalR

我們需要在應用程序中實時更新必須在數據庫級別(而不是控制器級別)進行跟蹤。

我們選擇使用SQL Dependency和SignalR作爲我們的解決方案。

我研究過的關於SignalR和SQL依賴關係的一切都在數據庫級別,SQL依賴性將在數據層內識別更改和廣播。由於顯而易見的原因,此方法將繞過在業務層中創建的派生屬性,並給我們一個不同的外觀對象。

我能想到的唯一解決方案是使用SQL Dependency跟蹤更改,將它們轉儲到某個表/對象中,然後使用輪詢從控制器,到biz層,到數據層獲取這些更改,然後備份。

  • 問題1:有沒有更好的解決方案?
  • 問題2:什麼是包含業務層邏輯的最佳解決方案,但仍然能夠跟蹤數據層的更改?
  • 問題3:這可能沒有投票嗎?

回答

0

SqlDependencyleaves垃圾在您跟蹤的數據庫中,並且不會自行清理。避免使用它!使用開源實現,而不是 - SqlDependencyEx。這是很容易配置和使用:

// See constructor optional parameters to configure it according to your needs 
var listener = new SqlDependencyEx(connectionString, "YourDatabase", "YourTable"); 

// e.Data contains actual changed data in the XML format 
listener.TableChanged += (o, e) => Console.WriteLine("Your table was changed!"); 

// After you call the Start method you will receive table notifications with 
// the actual changed data in the XML format 
listener.Start(); 

// ... Your code is here 

// Don't forget to stop the listener somewhere! 
listener.Stop(); 

通過上面你提到的,甚至可以跟蹤實際成分改變的數據,您可以從事件處理程序的事件參數得到。希望這可以幫助。

+0

這不能解決我的問題,因爲這種類型的代碼/邏輯不應該在業務級別。業務級別不應該意識到任何涉及該模式的內容,只應該在DTO上工作。 – mtsuggs

+0

爲了什麼目的?那麼你可以坐下來欣賞,你保持了三層概念,而犧牲一個解決方案?我們使用這些工具來解決問題。並非每個問題都適合我們都喜歡這個十年的設計模式的最新理念。你有一個解決方案,所以你模糊你的控制器和業務層。大不了。只要保持視圖或最終用戶不受直接數據訪問的影響,您仍然是個好主意。 – Jason

1

您的數據層捕捉數據庫引發的事件。讓它將數據映射到合適的DTO中,然後引發一個事件以被業務層捕獲。業務層然後可以將事件引發到可以執行SignalR Broadcast()的View層。冒泡!