我认为有很多方法可以做到这一点,但这真的取决于你的情况。您应该做的第一件事是考虑您的对象图有多深或多复杂。
所以,作为一个粗略的指南......
- 如果您的对象图很深且很复杂,请考虑使用
Faker
外观来伪造对象。这意味着创建static
工厂方法,例如:
void Main()
{
Search("Micro*").Dump();
}
public Organization Search(string search)
{
return CreateOrganization(code: search);
}
static Organization CreateOrganization(string code = null){
var faker = new Faker();
//setup complicated child dependency graphs here.
//then finally create your parent object below.
return new Organization{
Code = code ?? faker.Company.CompanyName()
};
}
public class Organization
{
public string Code { get; set; }
}
![](https://i.stack.imgur.com/3bnrz.png)
- 如果您正在生成没有非常大或复杂的对象图的 POCO/DTO 类型的对象,那么使用
Faker<T>
应该也能很好地工作。例如:
void Main()
{
Search("Micro*").Dump();
}
public Organization Search(string code){
var customOrgFaker = Fakers.OrgFaker.RuleFor(x => x.Code, f => code);
return customOrgFaker.Generate();
}
static class Fakers{
public static Faker<Organization> OrgFaker =>
new Faker<Organization>()
.RuleFor(o => o.Code, f => f.Company.CompanyName());
}
![](https://i.stack.imgur.com/3bnrz.png)
请注意,在上面的Faker<T>
示例中,我调用.RuleFor(_ => _.Code, ...)
了两次,但只有最后一次调用.RuleFor
才会适用。在这种情况下.RuleFor(x => x.Code, f => code)
是之前的最后一次通话.Generate()
。实际上,这就像.RuleFor(o => o.Code, f => f.Company.CompanyName())
在Fakers
.
另请注意,每次.OrgFaker
访问该属性时,new Faker<T>
都会创建 a。这很好,因为每个属性访问都会为您的消费和定制.OrgFaker
创建一个专用实例。Faker<T>
如果这对您不起作用并且您只有一个实例Faker<T>
可以使用,您可以使用该Faker<T>.Clone()
方法克隆Faker<T>
并再次.RuleFor
使用发散规则调用而不会弄乱Faker<T>
.
分手建议...
最重要的是,使用上述任何方法,您的首要任务应该是保持代码干净、清晰和可读。力求最简单和最可维护的解决方案。
希望有帮助!