2012-04-26 37 views
0

在使用存儲庫和服務模式的應用程序中,如何確保始終調用服務層,而不是直接調用存儲庫?存儲庫/服務模式和數據一致性

例子:

class OrderRepository 
{ 
    void CreateOrder(Order o) 
    ... 
} 

class OrderService 
{ 
    void CreateOrder(Order o) 
    { 
     //make some business logic tests 
     ... 

     //call repository 
     _orderRepository.CreateOrder(o); 
    } 
} 

我看到兩個問題:

  • 程序員可以調用庫直接,因爲它不知道服務是否存在等(有時它不是那麼簡單在這個例子中(1個服務= 1個存儲庫具有相同的方法名稱),一些應用程序沒有很好的記錄,或者有人急於忘記檢查相應的服務是否存在(錯誤))。

  • 完全不同:很久以前,有人創建了一些視圖+直接使用訂單倉庫的控制器。那時不需要進行業務邏輯檢查或額外的操作,只需要訂單存儲庫(因爲它根本不需要)。如果以後,在創建訂單時需要一些額外的操作,將創建一項服務。問題在於所有進行舊存儲庫調用的控制器都需要更改。存儲庫原理/想法(以及分層代碼)是否應該使部件彼此獨立?

+0

「......應該讓零件相互獨立嗎?」這是一個誤解。它旨在使*責任*彼此獨立。 'OrderRepository'仍然負責從數據庫中提取數據並將數據保存到數據庫,'OrderService'用於應用管理訂單的邏輯。嘗試通過改進方法名稱來使這些責任更加清晰。 「SaveOrder」而不是'CreateOrder'代替'OrderRepository'是一種方法。換句話說: – 2012-04-26 20:32:44

回答

1

您可以構建您的解決方案,以便所有存儲庫和服務都在各自的項目中,例如, RepositoriesServices

應引用Repositories的唯一項目將是Services。這樣,其他項目將無法訪問存儲庫。當然,沒有什麼可阻止開發人員將存儲庫項目包含到控制器項目中,但希望在這一點上他們會問自己爲什麼不包括在首位。

+0

:這是否意味着我將不得不從一開始就爲每個可能的存儲庫創建一個服務(以及其中的每個方法)?如果我有很多存儲庫和方法,它會需要巨大的努力來創建和維護? (或者我不明白你的建議) – tigrou 2012-04-26 19:54:58

+0

這可能是我不明白你的問題。我所描述的是,如果存儲庫永遠不會被直接調用,那麼總是有一個服務會調用一個(或多個)存儲庫。如果可以直接調用某些存儲庫,則這不起作用。至於努力,如果你只是想公開一個簡單的存儲庫方法,那麼涉及更多的管道工作,但我覺得值得。 – Lester 2012-04-26 20:00:05

1

Static analysis工具可以在這方面提供幫助。

nDepend是一個商業工具,可以集成到您的構建過程中,並在這種情況下出錯(任何非服務類直接調用存儲庫類)。