我读了很多关于DDD的内容,但我不知道如何在现实生活中使用它。我为一些我无法理解的事情做了一些例子(使用C#和实体框架)。
- 为用户添加资金。用户只需要很多钱。
醇>
好的,这很简单。它是模型User
class User
{
public decimal Balance {get; private set; }
public void AddMoney(decimal sum)
{
if(sum>0)
Balance+=sum;
}
}
但我怎么能用呢?
那么,第一个问题是我应该从数据库(存储库)执行获取和保存数据?我不能在我的域模型中执行此操作。
- 用户有交易历史,而不仅仅是简单的总和
醇>
class User
{
public ICollection<Transaction> Transactions {get; private set; }
public void AddMoney(decimal sum)
{
if(sum>0)
Transactions.Add(new Transaction(sum));
}
}
在这种情况下,我应该从数据库中获取用户,然后EF将新的实体添加到集合中。但它不是有效的,更有效的是做这样的事情:
transactionsRepository.Add(new Transaction(sum, userId));
但它不是DDD方式。
- 从一位用户那里获取资金并转移到另一位用户
醇>
在这种情况下,操作会影响多个模型。 我应该把逻辑用于多个模型吗?(也许这个例子不够好)。
- 获取用户&#39;当前余额
醇>
用户余额是所有交易的总和
decimal Balance() => transactionsRepository.Get().Sum(x=>x.TransactionSum);
在这种情况下,查询包含逻辑 - 我应该如何获取数据来执行某些操作,而不是像其他示例中那样简单的获取\保存实体。 我应该在哪里查询逻辑?获取总余额,获取最后未读消息等。
答案 0 :(得分:1)
那么,第一个问题是我应该从数据库(存储库)执行获取和保存数据的位置?我无法在我的域模型中执行此操作。
您可以在Application service
中的Layered architecture
或CQRS architecture
中的命令处理程序中执行此操作。
但它效率不高,效率更高
它更有效但实际上不是DDD方式。聚合应该不依赖于存储库。它们仅适用于存储在内存中的状态。应用程序服务负责冷却加载和存储聚合。
我应该把逻辑用于多个模型吗?
在Sagas /流程经理中。
我应该在哪里查询逻辑?
这取决于你的查询。
如果不使用CQRS:
如果您使用Aggregate方法从Aggregate查询数据。
如果查询聚合的特定列表,则将该逻辑放入存储库中。
如果使用CQRS,那么任何查询都是在读模型/投影上完成的。