我在解决处理相当复杂的场景时遇到了一些困难.我见过很多类似的问题,但没有一个能让我满意.
使用多个OrderLines(子实体)创建订单(聚合根).根据业务规则,每个OrderLine必须在订单的生命周期内保持相同的标识.OrderLines具有许多(20+)属性,并且在Order被视为"锁定"之前可以经常变异.此外,还有一些不变量必须在根级别强制执行; 例如,每个订单行都有一个数量,订单的总数量不能超过X.
在考虑更改OrderLines时,我不确定如何对此方案进行建模.我有4个选择,我可以设想,但似乎没有一个令人满意:
1)当需要修改OrderLine时,请使用root提供的引用.但是我失去了检查根中不变逻辑的能力.
var orderLine = order.GetOrderLine(id);
orderLine.Quantity = 6;
Run Code Online (Sandbox Code Playgroud)
2)在订单上调用方法.我可以应用所有不变的逻辑,但后来我坚持使用大量的方法来修改OrderLine的许多属性:
order.UpdateOrderLineQuantity(id, 6);
order.UpdateOrderLineDescription(id, description);
order.UpdateOrderLineProduct(id, product);
...
Run Code Online (Sandbox Code Playgroud)
3)如果我将OrderLine视为值对象,这可能会更容易,但它必须为每个业务需求保持相同的标识.
4)我可以获取对OrderLines的引用以获取不影响不变量的修改,并为那些执行此操作的命令执行订单.但是如果不变量受大多数OrderLine属性的影响呢?这个异议是假设的,因为只有少数属性可以影响不变量,但是随着我们发现更多业务逻辑,这可能会发生变化.
任何建议都表示赞赏...如果我是密集的,请不要犹豫,让我知道.
对于我的测试,我需要第一次调用stub来返回一个对象,然后下一次调用返回一个不同的对象.我已经在record()块中的其他模拟对象框架中看到过这个,但我还没弄清楚如何在FakeItEasy中做到这一点.FakeItEasy是我们商店的强制框架,我使用AutoFixture来制作假货.
我查看了NextCall,但看起来我不能指定返回值.
这是我想要做的事情的想法:
ReceiveMessageResponse queueResponse1 = fixture.Create<ReceiveMessageResponse>();
ReceiveMessageResponse queueResponse2 = fixture.Create<ReceiveMessageResponse>(seed);
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse1);
//The following should happen the second time...
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse2);
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
我有一个带有一堆属性的User对象.我要求说明当用户设置他们的信息时,他们需要能够说明他们的个人资料的哪些属性对其他人可见.
我设想的方式是添加一个额外的属性 - 一个字符串列表,其中包含公开可见的属性名称.然后,我可以实现一个名为ToPublicView()的方法或类似的方法,它将使用反射将非公共属性设置为null或default.
这是一种合理的方法,还是有更好的方法?