【发布时间】:2023-04-05 06:21:02
【问题描述】:
我阅读了很多有关 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 方式。
- 从一位用户那里获得资金并转移给另一位用户
在这种情况下,操作会影响多个模型。 我应该把适用于多个模型的逻辑放在哪里?(也许这个例子不够好)。
- 获取用户当前余额
用户的余额是所有交易的总和
decimal Balance() => transactionsRepository.Get().Sum(x=>x.TransactionSum);
在这种情况下,查询包含逻辑 - 我应该如何获取数据来做某事,而不是像其他示例中那样简单的 fetch\save 实体。 我应该在哪里放置逻辑查询?获取总余额,获取最后未读消息等。
【问题讨论】:
-
如果没有要检查所有事务的不变量,则没有理由在聚合中保存事务集合。事务可以通过它自己的存储库成为它自己的聚合:
Transaction t = user.AddMoney(sum); transactionRepo.Add(t);将是完全有效的。 -
请注意,会计不是这样运作的......
标签: c# entity-framework domain-driven-design