2011-05-05 50 views
5

假設我的業務層當前包含一堆DTO和單獨的服務類以與數據存儲庫進行通信。哪一層功能如下:緩存和日誌屬於?

例子:

class PersonService 
{ 
    IPersonRepository _personRepository; 
    ILogging _logger; 
    ICacheStorage _cache; 
    // Constructor here to create concrete objects. 

    public Person GetPersonById(int Id) 
    { 
     // error logging and caching here??? 
    } 
} 

是否有意義記錄和緩存在這一層?或者應用程序服務層處理這些問題會更有意義嗎?或者也許完全是其他的東西?

回答

3

緩存可以或應該儘可能地實現。緩存也應該是透明的,所以任何使用它的人都不應該知道它是實際使用的。大多數情況下,將其放入數據訪問層是合乎邏輯的,但有時將其放入業務層也是合乎邏輯的並可能。

記錄是IMO的東西,不屬於任何層。它應該是一個訪問點的應用程序範圍。

+0

+1。只要有意義,請使用緩存。你可以在DAL中使用它,這樣它就可以讓自己的生活更輕鬆; BL可能會緩存從DAL獲得的內容以保存BL \ DAL邊界上的呼叫。如果BL談到多個DA實現(如服務),後者也是有意義的。 – 2011-05-06 02:44:29

+0

同意 - 記錄是一個交叉問題,可以去任何地方。 – 2011-05-06 02:45:39

1

我想說緩存是數據檢索的實現細節。就PersonService而言,它有一個PersonRepository可用於獲取其數據。它可能在內存或數據庫中的事實是一個它不需要關心的細節。因此,我說緩存在數據訪問層。

至於伐木,可以在任何地方和任何地方。記錄真的沒有「錯誤」的地方。 (這就是爲什麼它通常被看作是「交叉切割問題」,爲什麼人們會使用AOP進行日誌記錄,請參閱此處的討論:Advice on AOP with C#

+0

數據訪問層如何知道何時到期緩存?這不是域邏輯的一部分嗎? – Henrik 2011-05-05 14:59:51

+0

@亨利克:是嗎?我認爲到期時間仍然是應用程序中存儲機制的細節,而不是事物的業務方面。 – BFree 2011-05-05 15:05:52

+0

這取決於。應用程序的BL可能會指示數據何時「過時」並需要刷新;或者,如果您要整合的數據屬於外部系統(或多個系統),則決定點可能在其他地方。 – 2011-05-06 02:49:29

1

日誌記錄和跟蹤是作爲工具類實現的,並且在整個架構的大部分或全部層中調用。緩存實現因層次和系統而異。您可以在不同層次上使用不同類型的緩存和緩存策略,並且完全取決於所討論的系統。您可以使用進程內和分佈式緩存的組合來實現所需的性能和一致性特性。