原文:CREATING SAMPLE DATA FOR C#
做者:Bruno Sonnino
译文:C#中使用Bogus建立模拟数据
译者: Lamond Lu数据库
在我每次写技术类博文的时候,常常作的一件事就是建立模拟数据。在每篇博文中,为了解释某些概念,我须要建立许多模拟数据。这是一个我在实际中遇到的问题,由于我须要为个人程序找到一些合适的数据。有些时候,我会从数据库中找一些数据(Northwind和AdventureWorks都是个人好朋友^.^), 有些时候,我会使用一些现成的Json或者Xml数据,固然有时候我只能本身手动建立一些数据。json
固然以上方案都不完美,也都不稳定,因此每次我都须要探索一些新方式来获取数据(对于学习来讲这很好,可是维护起来确是一种灾难)。
最后我找到了Bogus, 一个基于C#的简单数据生成器。c#
使用Bogus生成模拟数据, 你只须要定义规则并生成数据便可,就是这么简单。并且Bogus能够生成固定数据或者变化数据。这样一旦你拿到了这些数据,你就能够把它们序列化成你想要的格式: json, xml,数据库或者文本文件。dom
为了生成模拟数据,咱们首先须要针对模拟数据建立对应的实体类。这里咱们能够建立一个命令行程序,并添加一下两个类。单元测试
public class Customer { public Guid Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string City { get; set; } public string Country { get; set; } public string ZipCode { get; set; } public string Phone { get; set; } public string Email { get; set; } public string ContactName { get; set; } public IEnumerable<Order> Orders { get; set; } }
public class Order { public Guid Id { get; set; } public DateTime Date { get; set; } public Decimal OrderValue { get; set; } public bool Shipped { get; set; } }
在你建立好以上两个实体类以后,你就能够来添加仓储来获取模拟数据了。为了使用Bogus, 你可使用Nuget将Bogus库添加到你的项目中。学习
Install-Package Bogus测试
下面咱们就能够来添加一个仓储类来获取模拟数据了。这里咱们添加一个SampleCustomerRepository
类,并加入如下方法。ui
public IEnumerable<Customer> GetCustomers() { Randomizer.Seed = new Random(123456); var ordergenerator = new Faker<Order>() .RuleFor(o => o.Id, Guid.NewGuid) .RuleFor(o => o.Date, f => f.Date.Past(3)) .RuleFor(o => o.OrderValue, f => f.Finance.Amount(0, 10000)) .RuleFor(o => o.Shipped, f => f.Random.Bool(0.9f)); var customerGenerator = new Faker<Customer>() .RuleFor(c => c.Id, Guid.NewGuid()) .RuleFor(c => c.Name, f => f.Company.CompanyName()) .RuleFor(c => c.Address, f => f.Address.FullAddress()) .RuleFor(c => c.City, f => f.Address.City()) .RuleFor(c => c.Country, f => f.Address.Country()) .RuleFor(c => c.ZipCode, f => f.Address.ZipCode()) .RuleFor(c => c.Phone, f => f.Phone.PhoneNumber()) .RuleFor(c => c.Email, f => f.Internet.Email()) .RuleFor(c => c.ContactName, (f, c) => f.Name.FullName()) .RuleFor(c => c.Orders, f => ordergenerator.Generate(f.Random.Number(10)).ToList()); return customerGenerator.Generate(100); }
这里的第三行代码,咱们为
Randomizer.Seed
属性指定一个固定的随机种子,所以每次生成的数据都是同样的。若是你不但愿每次都生成固定的数据,你能够去掉这行代码。命令行
这里咱们为订单和客户数据的生成定义了规则,而后咱们调用了Generate
方法来生成模拟数据。就是这么简单。设计
如上所见,Bogus提供了许多类来生成数据。例如Company
类能够用来生成公司模拟数据,例如公司名称。你可使用这些生成的数据做为你程序的模拟数据,这些数据有3种使用场景
可是我确信,你能发现更多的使用场景。
这里为了使用这些数据,你能够在Main
方法中加入如下代码
static void Main(string[] args) { var repository = new SampleCustomerRepository(); var customers = repository.GetCustomers(); Console.WriteLine(JsonConvert.SerializeObject(customers, Formatting.Indented)); }
这里咱们将模拟数据转换成了Json字符串,因此这里你须要添加对Newtonsoft.Json
库的引用。当你运行程序以后,你会得要如下结果。
如上所见,程序生成了一个顾客的数据集,并附带了每一个顾客的全部订单信息。