程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# 實用微型框架:FakeDataTool (Version 1)

c# 實用微型框架:FakeDataTool (Version 1)

編輯:C#入門知識

最近公司從微軟接了許多小項目,導致了人手不夠,特別是數據庫後台和前台脫節嚴重,部分客戶已經發飙,無奈之下,昨天下午老板和我們teamLeader 之間開了個緊急會議,
商量應對之道。由於前台的效率比後台高(後台大牛走的走,已經所剩無幾,許多實習生或者是剛入職的),所以在下周投入後台工作之前,我向老板提出了“fakeDataTool”的
理念,就是一個制造臨時假數據的微型框架,能夠解決燃眉之急,老板曾經是個偉大的架構師,所以他欣然接受這一個想法,於是一個微型框架的第一個版本在今天凌晨5點誕生了。。。
這個版本完成的功能有:
1: 制造一個類的對象,並且屬性賦值 (第一本版本只有已經實現了 class ,string,guid,int ,int?,double,double,IEnumerable,IDictionary)
2:   該類所有的父類遞歸創造對象並賦值(嚴格來說到達object類型為止)
3:  給予程序員(用戶) 自己填寫config後,交給框架實現上述功能 (第一本版本只有 生產單一對象和集合對象(IEnumerable)功能)
4:  給予程序員(指定)屬性的范圍,暫定用Attribute實現(例如 int類型 是 0 到100 之間的隨機數,string 類型是一個字符串數組中的隨機字符串)
5:  設定好的 IExporter接口用幾天後實現各種輸出功能(xml,json,words)
6:  一系列bug需要更改:自己引用自己,自己引用別類,別類中又有自己。。。。。(會導致溢出) 等等
先看這段代碼:
  
 static void Main(string[] args)
        {
            FakeDataConfig config = new FakeDataConfig
            {
                ConfigName = "StudentConfig",
                FakeDataCount = 3,
                GetFakeType = FakeDataType.IEnumerableData
            };
            FakeDataTool tool = new FakeDataTool(config);
            var data = tool.CreateFakeEnumrableData<Student>();
        }

其實這個工具使用起來非常的簡單,聲明一個config 然後輸入你需要創建的類型,創建假數據的個數等等,然後通過工具便制造出了一系列的假數據
寫過小框架的兄弟們都知道,有時過於封裝未必是件好事,所以一番思想斗爭後我決定還是暴露下FakeDataTool 的方法
接著是實體類的樣子:
 1    public class Human
 2     {
 3          [FakeData(new string[] { "aaa", "bbb", "ccc" })]
 4         public string Gender { get; set; }
 5        
 6     }
 7
 8     public class Man:Human
 9     {
10         public Guid ID { get; set; }
11         [FakeData(2, "Man")]
12         public List<int> HumanProperty { get; set; }
13         [FakeData(2, "man")]
14         public Dictionary<int, int> HumanList { get; set; }
15     }
16
17     public class Student :Man
18     {
19         [FakeData(new string[] { "aaa", "bbb", "ccc" })]
20         public string Name { get; set; }
21         [FakeData(100)]
22         public int Age { get; set; }
23          [FakeData(2, "Student")]
24         public Dictionary<int, Human> HumanList { get; set; }
25    
26     }

可能大家一看就明白了,FakeData標簽的功能是約定該類的第一層(第一層是什麼東東? 這裡一定要向大家說清楚的是,在這裡第一層指的是 一個類(包括它所有父類中非集合屬性的取值層面))
聰明的你已經反映過來了,在student類中 IDictionary<int,Huaman> 這裡面兩個泛型參數的制造取值已經不是第一層了
1.FakeData(new string[]...) 這個只適用於字符串類型的屬性,字符串數組可以隨便定義,fakeDataTool會在第一層將這些數組內的元素賦值給打了標簽的屬性
2.FakeData(int) 這個是針對整形數據的數據范圍,默認從0開始到 標簽上的數值
3. FakeData(2,"Student")這個專門使用在集合屬性中 表示在這個集合中制造對象的數量
 
大家可以看下結果:

  \


 

大家也許會覺得奇怪:humanList為什麼裡面對象的值是這樣,我不是在 Human類上打上標簽了? 還是回到先前的話題:第二層甚至於更高的層面會變的相當復雜,由於時間的關系,我只能將該優化放置後期版本

 用這個方式來幫助大家理解復雜度:IDictionary<int,IDictionary<int,List<IDictionary........

 

接下來就說明下改微型框架的架構:
  \



 

自上而下:
1 Exporter 模塊:將最後制造完的假數據進行輸出到特定的文件上 (將在後期版本陸續實現)
 1     public enum ExportFileType{XMLExport,JSon,Txt,Word}
 2
 3     interface IExporter
 4     {
 5         void ExportToFile();
 6     }
 7
 8     public abstract class ExporterBase:IExporter
 9     {
10         public ExportFileType FileType{get;set;}
11         public abstract void ExportToFile();
12     }

 
2 上部右側分別是: FakeDataAttribute類,FakeDataHelper類和FakeDataException異常類
 1     public class FakeDataAttribute:Attribute
 2     {
 3         public int FakeRange { get; set; }
 4         public string[] FakeStringData{ get; set; }
 5         public int FakeSubClassOrTypeCount { get; set; }
 6
 7         public FakeDataAttribute() :
 8             this (null)
 9         {
10        
11         }
12
13         public FakeDataAttribute(int fakeRange=100)
14         {
15             this.FakeRange = fakeRange;
16
17         }
18
19         public FakeDataAttribute(string[] fakeStringData)
20         {
21             this.FakeStringData = fakeStringData;
22         }
23
24         public FakeDataAttribute( int fakeSubClassCount,string subTypeName=null)
25         {
26             this.FakeSubClassOrTypeCount = fakeSubClassCount;
27         }
28
29     }

 
 
3 中下部是用戶輸入一個命令(制造一個假對象還是制造多個)
  Command  ->命令 Reciver 通過用戶的config 制造用戶所需要的對象,制造完畢後親自交給用戶,
   reciver 利用抽象工廠制造數據www.2cto.com
 1  class CreateObjectCommand<T> : CommandBase<T> where T : class
 2     {
 3         private object newObject;
 4         public object NewObject
 5         {
 6             get { return this.newObject; }
 7         }
 8
 9         public CreateObjectCommand(CreateObjectReciver<T> recever)
10             : base(recever)
11         {
12         }
13
14         public override void ExcuteThisCommand()
15         {
16             var createObjectReciver = this.Recever as CreateObjectReciver<T>;
17             var config = createObjectReciver.config as FakeDataConfig;
18             if (config.GetFakeType == FakeDataType.singleDataOnly)
19             {
20                 this.newObject = createObjectReciver.CreateObject();
21             }
22             else if (config.GetFakeType == FakeDataType.IEnumerableData)
23             {
24                 this.newObject = createObjectReciver.CreatEnumerableData();
25             }
26         }
27     }

 

以上便是這個微不足道的小框架的基本情況,等會我便會上傳代碼,如果有bug 或有更好的建議,也請大家能夠指出,希望能和大家一塊學習進步

 

摘自 逆時針の風 

  1. 上一頁:
  2. 下一頁: