(原創)c# 實用微型架構:FakeDataTool (Version 1)

來源:互聯網
上載者:User

最近公司從微軟接了許多小項目,導致了人手不夠,特別是資料庫後台和前台脫節嚴重,部分客戶已經發飆,無奈之下,昨天下午老闆和我們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 利用抽象工廠製造資料

 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 或有更好的建議,也請大家能夠指出,希望能和大家一塊學習進步

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.