2013-04-26 59 views
2

我試圖想出一個通用模型,用於將一些上下文數據與C#中的對象相關聯。我建立了一個可以描述如下緩存系統......將上下文數據添加到共享對象

背後的故事 - >緩存是一個單獨的實現,提供了「只讀」訪問經常要求是,我使用自定義的CMS實施的一部分信息爲各種asp.net應用程序。我通過我編寫的桌面應用程序更新數據,下次Web服務器加載緩存時,我的更改會反映給訪問者。 我的緩存遵循以下...

  1. 每個對象都有一個唯一的ID

  2. 任何對象都可以與任何其他對象通過在關聯表中定義的ID映射相關

  3. 無論存在多少個與特定對象的關聯,只有該對象的一個​​實例被加載到緩存中。

例如...對象A可能會關聯到對象C的集合。類似地,對象B也可以關聯到對象C的集合。如果有人從對象A的實例請求一個ID爲23的對象C,然後從對象B請求一個ID爲23的對象C,則它們將得到對象C的相同實例的句柄。

我現在有一些數據添加到圖片中,但數據本身不屬於對象A,並且它本身不屬於對象C.該數據與對象C.

  1. 我最初的想法特定對象A的關聯信息:保持額外的數據從對象C分開,因爲它不屬於真正通過自身對象C。在對象A中維護這些信息並允許它在Dictionary中查找。我不喜歡用這種方法訪問數據的方式。我寧願通過對象C或派生類直接訪問附加數據,以實現綁定和易用性。

  2. 我的第二個想法:從對象C創建一個派生類(稱爲對象D),它包含附加的上下文數據並提供易於訪問的屬性。這解決了綁定問題,併爲我提供了我一直在尋找的易用性。這種方法的問題是,現在我的對象A引用了對象D的集合,我需要通過複製對象A的全部數據來打破上述模型,以便我可以附加一些額外的關聯信息。

我真的想是繼續具有對給定id只有一個對象C的實例,並追加了可以在適當的情況下很容易地訪問一些上下文數據和屬性。這可以做到嗎?我也打開這裏的任何其他建議!我希望我的解決方案具有通用性和可靠性,所以我可以將它忘掉,並且不需要經常回頭尋找更好的解決方案。

+0

您如何看待'只有該對象的一個​​實例'?例如,五個列表都添加了同一個對象,並且有五個列表引用,但實際上「只有一個實例」。我們認爲一樣嗎? – 2013-04-26 19:47:09

+0

@KenKin是的。如果高速緩存正在加載,並且有五個列表,每個請求添加同一個對象...第一次遇到該對象時,它將從數據庫加載。對於以下四個列表,請求不會觸及數據庫,而是添加對現有實例的引用。 – lpdev 2013-04-26 21:07:04

+0

好的。但似乎你只是想爲數據庫創建一個本地緩存? – 2013-04-26 21:24:49

回答

0

我結束了我的第二個想法。對象D成爲一種特殊類型的對象,具有它自己的屬性/成員/方法,但也有一個返回對象C的屬性。對象D必須實現一個特定的接口,以便通過我的緩存算法來識別。我更新了緩存系統,以確保如果屬性返回的對象C已經被加載,那麼將返回一個,而不是從db中加載額外的副本。

0

對象C實例應該擁有自己的數據。當然,您可以通過從緩存中檢索對象(通過對象A或對象B)將「路徑」存儲在其中,但將此類信息存儲在對象中會修改對象,因此如果要檢索對象通過另一個「路徑」,信息將被覆蓋。

一個解決方案可能是克隆對象C每次從緩存中檢索並存儲您的「路徑」,或存儲額外的數據,如果它通過對象A?

這樣,緩存中的所有對象都按請求共享,但在緩存外獨立一次。