最近公司從微軟接了許多小項目,導致了人手不夠,特別是數據庫後台和前台脫節嚴重,部分客戶已經發飙,無奈之下,昨天下午老板和我們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 或有更好的建議,也請大家能夠指出,希望能和大家一塊學習進步
摘自 逆時針の風