• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

(原创)c# 实用微型框架:FakeDataTool (Version 1)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近公司从微软接了许多小项目,导致了人手不够,特别是数据库后台和前台脱节严重,部分客户已经发飙,无奈之下,昨天下午老板和我们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 或有更好的建议,也请大家能够指出,希望能和大家一块学习进步

转载于:https://www.cnblogs.com/JimmyZheng/archive/2012/03/03/2378692.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap