我读了很多有关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);
在这种情况下的查询包含逻辑的总和 - 我应该如何获取数据来做点什么,而不是像其他例子那样简单获取\保存实体。 我应该在哪里放置逻辑查询?获取总余额,获取最后的未读消息等。
如果没有不变量来检查所有事务,那么没有理由在一个聚合中保存事务的集合。事务可以成为它自己的集合,它有自己的仓库:'Transaction t = user.AddMoney(sum); transactionRepo.Add(t);'完全有效。 – plalx
请注意,这不是如何会计作品虽然... – plalx