在进行域驱动开发时对数据进行排序

时间:2010-10-27 11:18:43

标签: architecture domain-driven-design

在开发我的数据模型时,我没有注意底层数据库级别。我在我的域类的属性中封装了一些逻辑(例如:计算订单利润的方法)。这一切都运行良好,直到我需要排序数据。排序是一个纯粹的数据库功能(主要是因为我无法从表中检索所有行并在我的域级别对它们进行排序)。
事实证明我必须重复逻辑,以前封装在数据库级别的域级别中(不仅重复,而且将其转换为数据库语言)。
这似乎很糟糕,我不想这样做 有没有办法绕过这样的问题?

修改
我正在尝试做的例子:
我的域名:

class Order {
  var lines;

  profit() {
    return lines.sum(line => line.sellPrice * line.quantity) - 
      lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity)
  } 
}

class Line {
  var outcomes;
  var sellPrice
}

class Outcome {
  var buyPrice;
  var quantity;
}

问题是当我想按利润对订单进行排序时,结果是sql代码中的许多连接和计算(重复逻辑已经在Order.profit()方法中编写)。
我实际上已经想到将计算值存储在数据库中而不是计算它们

2 个答案:

答案 0 :(得分:0)

而不是:

class Order {
  lines;

  profit() {
    return lines.sum(line => line.sellPrice * line.quantity) - 
      lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity)
  } 
}

class Line { outcomes; sellPrice }    
class Outcome { buyPrice; quantity; }

写下这个:

class Order {
  lines; profit;
  void Order(lines){
    profit = lines.sum(line => line.sellPrice * line.quantity) - 
      lines.takeAllOutcomesAndSum(outcome => outcome.buyPrice * outcome.quantity)
  }
}

class Line { outcomes; sellPrice; }    
class Outcome { buyPrice; quantity; }

请确保保持有效(每次订单更改时都会更新)并且应该没问题。

答案 1 :(得分:0)

一般的解决方案是在域级别声明您需要的内容,并从中生成相关的数据库代码。