域驱动设计中的逻辑位置

时间:2017-04-11 19:36:50

标签: c# entity-framework domain-driven-design

我读了很多关于DDD的内容,但我不知道如何在现实生活中使用它。我为一些我无法理解的事情做了一些例子(使用C#和实体框架)。

  
      
  1. 为用户添加资金。用户只需要很多钱。
  2.   

好的,这很简单。它是模型User

的示例
class User
{
    public decimal Balance {get; private set; }

    public void AddMoney(decimal sum)
    {
        if(sum>0)
           Balance+=sum;
    }
}

但我怎么能用呢?

  1. 从数据库中获取用户
  2. 更新用户 - 由域模型执行
  3. 保存更改
  4. 那么,第一个问题是我应该从数据库(存储库)执行获取和保存数据?我不能在我的域模型中执行此操作。

      
        
    1. 用户有交易历史,而不仅仅是简单的总和
    2.   
    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方式。

      
        
    1. 从一位用户那里获取资金并转移到另一位用户
    2.   

    在这种情况下,操作会影响多个模型。 我应该把逻辑用于多个模型吗?(也许这个例子不够好)。

      
        
    1. 获取用户&#39;当前余额
    2.   

    用户余额是所有交易的总和

    decimal Balance() => transactionsRepository.Get().Sum(x=>x.TransactionSum);
    

    在这种情况下,查询包含逻辑 - 我应该如何获取数据来执行某些操作,而不是像其他示例中那样简单的获取\保存实体。 我应该在哪里查询逻辑?获取总余额,获取最后未读消息等。

1 个答案:

答案 0 :(得分:1)

  

那么,第一个问题是我应该从数据库(存储库)执行获取和保存数据的位置?我无法在我的域模型中执行此操作。

您可以在Application service中的Layered architectureCQRS architecture中的命令处理程序中执行此操作。

  

但它效率不高,效率更高

它更有效但实际上不是DDD方式。聚合应该不依赖于存储库。它们仅适用于存储在内存中的状态。应用程序服务负责冷却加载和存储聚合。

  

我应该把逻辑用于多个模型吗?

在Sagas /流程经理中。

  

我应该在哪里查询逻辑?

这取决于你的查询。

如果不使用CQRS:

如果您使用Aggregate方法从Aggregate查询数据。

如果查询聚合的特定列表,则将该逻辑放入存储库中。

如果使用CQRS,那么任何查询都是在读模型/投影上完成的。