小编Cor*_*ork的帖子

DDD - 聚合中子对象的修改

我在解决处理相当复杂的场景时遇到了一些困难.我见过很多类似的问题,但没有一个能让我满意.

使用多个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属性的影响呢?这个异议是假设的,因为只有少数属性可以影响不变量,但是随着我们发现更多业务逻辑,这可能会发生变化.

任何建议都表示赞赏...如果我是密集的,请不要犹豫,让我知道.

domain-driven-design aggregateroot

11
推荐指数
4
解决办法
3559
查看次数

从FakeItEasy A.CallTo()返回不同的对象

对于我的测试,我需要第一次调用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)

任何帮助表示赞赏.

unit-testing fakeiteasy

8
推荐指数
2
解决办法
3064
查看次数

具有用户可配置属性"可见性"的对象

我有一个带有一堆属性的User对象.我要求说明当用户设置他们的信息时,他们需要能够说明他们的个人资料的哪些属性对其他人可见.

我设想的方式是添加一个额外的属性 - 一个字符串列表,其中包含公开可见的属性名称.然后,我可以实现一个名为ToPublicView()的方法或类似的方法,它将使用反射将非公共属性设置为null或default.

这是一种合理的方法,还是有更好的方法?

c# oop properties

5
推荐指数
1
解决办法
516
查看次数