目标

这个工具的目标是能够在项目初期快速搭建一个“数据提供器”,快速的为前端提供数据支撑,从而方便项目定型;当然,或许这不是一个正确的开发流程。不过存在决定方法,这里不讨论理想情况。基于这个目标,目前有两种方式:

  1. 基于“仓储”的“伪实现”。由于项目框架中进行了仓储隔离,所以可以考虑为仓储提供一个“数据池”,在忽略业务的情形下快速提供数据。基于IoC的思想,这种实现中,业务层必须不晓得“假数据”的存在。所以不能让和这个组件相关的任何信息、任何代码倾入业务。也就是说,不能使用声明式的方案,得使用类似于EF的Map的方案。
  2. 基于“应用程序层”的“伪实现”。第一个方案的缺点是仍然不够快,需要编写一定量的代码。所以第二个方案的特点是,全部基于Attribute声明,快速确定前后端需要传输的数据类型。因为这些定义的数据类型属于DTO,也没有必要去清理这些定义好的Attribute——而且,如果设计得当的话,完全可以将这些Attribute作为数据验证的依据。

选择

总的来说就是两个选择,要么自己实现,要么站在前人的基础上调整。
在Nuget上搜索了下Data Generater,发现不少的匹配项。找了其中一个下载量比较大的:

Bogus https://github.com/bchavez/Bogus

细看了下文档,感叹群众的眼睛果然是雪亮的。

扩展

Bogus完全符合[目标]这一节的第一点要求,但是没有发现基于Attribute的使用方式。所以决定自己扩展下。Bogus的配置入口是一个泛型类:Faker<>,配置方法是RuleFor,这个方法包含了2个重载,而且都是两个参数的。第一个参数都是一个MemberAccess的Lambda Expression,这个参数指示了你希望针对哪个属性配置。第二个参数是一个委托,指示了你希望如何返回值。该组件的Faker(非泛型)类型提供了丰富的数据提供方式。这也是这个组件最大的价值所在。以下是摘自GitHub的几个例子:

var testUsers = new Faker<User>() //Optional: Call for objects that have complex initialization .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####"))) //Ba