2017-04-11 56 views
1

我读了很多有关DDD的内容,但我不知道如何在现实生活中使用它。我用一些例子(用C#和实体框架)来说明我无法理解的事情。在领域驱动设计中的逻辑地点

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

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

class User 
{ 
    public decimal Balance {get; private set; } 

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

但是我怎样才能使用它?

  1. 从数据库中获取用户
  2. 更新用户 - 由域模型进行
  3. 保存更改

所以,第一个问题是,我应该执行读取和从数据库中保存的数据(资料库)?我无法在我的域模型中执行此操作。

  • 用户有交易的历史,不只是简单相加
  • 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); 
    

    在这种情况下的查询包含逻辑的总和 - 我应该如何获取数据来做点什么,而不是像其他例子那样简单获取\保存实体。 我应该在哪里放置逻辑查询?获取总余额,获取最后的未读消息等。

    +0

    如果没有不变量来检查所有事务,那么没有理由在一个聚合中保存事务的集合。事务可以成为它自己的集合,它有自己的仓库:'Transaction t = user.AddMoney(sum); transactionRepo.Add(t);'完全有效。 – plalx

    +0

    请注意,这不是如何会计作品虽然... – plalx

    回答

    1

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

    您在Layered architecture或在CQRS architecture命令处理程序做到这一点在Application service

    但它是没有效率的,更有效的是做这样的事情

    这是更有效,但确实不是DDD方式。聚合应该对存储库没有依赖性。它们只与存储在内存中的状态一起工作。应用程序服务负责加载和存储聚合。

    我应该把逻辑与多个模型一起工作?

    在Sagas/Process managers中。

    我应该在哪里放置逻辑查询?

    这取决于你查询什么。

    如果不使用CQRS:

    如果你从一个聚合的方法汇总查询数据。

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

    如果使用CQRS,则在读取模型/投影上完成任何查询。