C# 在AutoFixture中创建复杂子对象时使用父属性的值

C# 在AutoFixture中创建复杂子对象时使用父属性的值,c#,autofixture,C#,Autofixture,我使用AutoFixture为包含父对象和复杂子对象的结构生成数据,如下所示: public class Parent { public int Id { get; set; } public string Name { get; set; } public Child[] Children { get; set; } } public class Child { public string Name { get; set; } public int P

我使用AutoFixture为包含父对象和复杂子对象的结构生成数据,如下所示:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Child[] Children { get; set; }
}

public class Child
{
    public string Name { get; set; }
    public int ParentId { get; set; }
}
是否有方法自动将生成的子对象的属性
ParentId
设置为分配给父对象的id?现在我的解决方案看起来是这样的,它不是很漂亮:

var parent = fixture.Build<Parent>().Without(p => p.Children).CreateAnonymous();
parent.Children = fixture.CreateMany<Child>(10).ToArray();

foreach (var i in parent.Children)
{
    i.ParentId = parent.Id;
}
var parent=fixture.Build().Without(p=>p.Children.CreateAnonymous();
parent.Children=fixture.CreateMany(10.ToArray();
foreach(parent.Children中的变量i)
{
i、 ParentId=parent.Id;
}

感觉有更好的方法来做这件事,而我却错过了?我曾考虑过创建一个自定义的
ISpecimenBuilder
,但也没有通过这种方式解决问题。

AutoFixture基于一组规则和关于可能要求它使用的API的假设。考虑它是在没有预先知道“<代码>子< /代码>和<代码>父< /代码>类或给定API中的任何其他类型的情况下创建和编译的。它只需使用公共API即可

把AutoFixture想象成一个非常迟钝的程序员,他甚至不懂你的语言(甚至不懂英语)。制作API越多,使用AutoFixture就越容易

像这里描述的父/子关系这样的循环引用的问题是它破坏了封装。最初,您需要至少创建一个处于无效状态的类实例。让AutoFixture与这样的API一起工作很困难,这主要是一个警告信号,表明API可能会从重构中受益

此外,.NET Framework设计指南建议不要将数组公开为属性,尤其是可写属性。因此,对于AutoFixture和您自己以及您的同事来说,使用更好的封装设计,API可能更容易使用

考虑到上面的API,我不认为有任何方法可以使它更容易使用。考虑如何删除循环引用并使集合属性只读,这将更容易。


作为记录,我已经多年没有写过循环引用的API了,所以很有可能避免这些父母/孩子关系。

谢谢你的回复!关于API的设计,我完全同意你的看法。不幸的是,在这种情况下,我无法影响API的设计,我只能使用它。无论如何,我可能会继续使用AutoFixture,因为尽管我们的API很麻烦,但它使事情变得更容易。好吧,如果您总是像您的示例那样创建
Parent
实例,您总是可以使用
Customize
方法封装该行为。。。