2013/05/30

20130530-程式-Cache API 的使用範例

記錄一下今天所寫的內容,
今天弄到 八點多,先寄出一個概念出來,看這做法可不可行?

這樣的過程是很有意思的,下班時,與Nick討論相關的程式做法,
怎麼做比較好?以及 先前開會結束後,客戶 點的幾個點,都還蠻有意思的。

這樣的做法,到底好不好?看客戶那邊的反應了!

程式碼內容:

 public interface ICacheModel : IModel
    {

    }
    public class MyDBModel : ICacheModel
    {
        public string TypeKey { get; set; }
        public string DataKey { get; set; }
        public string DataValue { get; set; }
    }
    public class MySample
    {
        public void Sample()
        {
            //到時AP人員的使用方式
            MyDBModel result = CacheDataProvider.Get<MyDBModel>(new { TypeKey = "CC", DataKey = "DD" });
        }
    }
    public static class CacheDataProvider
    {
        /// <summary>取得指定型別的Cache資料</summary>
        /// <typeparam name="TCachedModel">取得指定型別</typeparam>
        /// <param name="modelKeyData">該型別的Key物件</param>
        /// <returns>該筆型別資料</returns>
        public static TCachedModel Get<TCachedModel>(object modelKeyData) where TCachedModel : ICacheModel, new()
        {
            //資料源範例(from cache)
            Dictionary<object, object> datasource = new Dictionary<object, object>();
            datasource.Add(new { TypeKey = "AA", DataKey = "AA" }, new TCachedModel());
            datasource.Add(new { TypeKey = "BB", DataKey = "BB" }, new TCachedModel());
            datasource.Add(new { TypeKey = "CC", DataKey = "CC" }, new TCachedModel());
            datasource.Add(new { TypeKey = "DD", DataKey = "DD" }, new TCachedModel());
            //取得資料
            var result = datasource[modelKeyData];
            return (TCachedModel)result;
        }
   }


=================

一開始的方向,
我是打算,他傳 Model 的Key 進來後,我把它的資料,以Dictionary的方式回傳。
變成單一筆DataModel,我想把它轉為 Dictionary List 的方式回傳出去。
想說,好處是 可以由 Dictionary [key]來判斷它的資料欄位存不存在???

但,這在使用上,會較難用。

======================
針對 Cache 得DBModel ,藉由 Interface 來做規範,

我那時想到另一個做法,透過 Enum 來定義,那幾個Table 有存入Cache ,
ex:public enum CacheTable {
     officer,
     sa_insurance,
}
然後在用時,就仿 資料授權 一樣,
CacheTable.officer.GetCache(key)  之類的寫法。

但這樣的想法被推翻了。 這樣會複雜些  (????好像是這樣的理由???)

而Interface 來規範 那幾個DBModel 有加入Cache 。
==============================

另一個主題: 排序& Search 。
針對 List Search  VS  Dictionary Search  那個較快?  (我上網還沒認真找資料)
我知道 List 的Where Search 是重頭開始查到尾。
而以為 Dictionary 也是 (只是它有key index 之類的)
但 Dictionary 並不是這樣
就被客戶 噹了一下

Dictionary 實際運作,也還沒有弄清楚,但以key index 找,應是比List Model 來的快。
所以,存入Cache 的方法,有了 「Dictionary( Key,DBModel)」的想法。

而中間 與Nick 、Wesley 也討論了 「Quick Sort」、「Binary Search」的方式。
(這是大四的演算法XDD~~當初真是不認真!)

而 Quick Sort 的方式,以下有一張「圖」介紹:
http://snipd.net/quicksort-in-c

原來上圖,那個紅棒一直在「相對右測」是使用 In-place 的方式。
(把基準點都先放置在最右測)

演算法介紹:
http://goo.gl/t9XSE
中文維基:http://goo.gl/yMNIO

但後來我們都想想,若是要「Search」,有必要先「Sort] 嗎???
因為 Sort 已不知把整個資料「掃描」過多少次了。

===========================
在來就是 Dictionary的部份,它的Key 可以是個object 嗎??
而此 object 是以 「匿名型別 Anonymous Type 」(new {col1=1,col2=2})時,是否可行??
就寫了簡單的測試:


     Dictionary<object, object> datasource = new Dictionary<object, object>();
            datasource.Add(new { id = 1, id2 = 2 }, new { Data1 = 1 });
            datasource.Add(new { id = 3, id2 = 4 }, new { Data3 = 3 });
            datasource.Add(new { id = 5, id2 = 6 }, new { Data5 = 6 });
            datasource.Add(new { myid=1 }, new { Data7 = 7 });

            dynamic result = datasource[new { myid = 1 }];
            var aa = result.Data7;



=====================================

所以,這資料是可行的。

===============================
下一步計畫:

這部份也這樣靈光乍現,在回家的路上想了這些。

1. 這是User取得Cache 的方式,那若該筆不存在Cache 時,就要到DB把該筆取出,放至Cache

而這部份,可以用 一個Function 打發所有的DBModel 。
(原因:在DBModel上都有描述Table資料,且用底層Framework,可以直接用Model Select)

程式概想:

{
      //回傳要存入Cache的方
}

 
 public Dictionary <object,object> GetFromDB(object modelKeyData)








0 意見 :

張貼留言