Я думаю, что есть много способов сделать это, но это действительно зависит от вашего сценария.Первое, что вы должны сделать, это рассмотреть, насколько глубоки или сложны ваши графы объектов.
Итак, в качестве приблизительного ориентира ...
- Если ваши графы объектов глубоки и сложны,рассмотрите поддельные объекты с фасадом
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>
.Это хорошо, потому что каждый доступ к свойству .OrgFaker
создает выделенный экземпляр Faker<T>
для вашего потребления и настройки.
Если это не работает для вас, и у вас есть только один экземпляр Faker<T>
дляработая с ним, вы можете использовать метод Faker<T>.Clone()
для клонирования Faker<T>
и снова вызывать .RuleFor
с расходящимся правилом, не путая исходный экземпляр Faker<T>
.
Советы по расставанию ...
В итоге, используя любой метод, описанный выше, ваш главный приоритет должен состоять в том, чтобы ваш код был чистым, понятным и читаемым.Стремитесь к самым простым и понятным решениям.
Надеюсь, это поможет!