Architecture 在进行域驱动开发时对数据进行排序
在开发数据模型时,我没有注意底层数据库级别。我在域类的属性中封装了一些逻辑(例如:计算订单利润的方法)。在我需要对数据进行排序之前,一切都很好。排序纯粹是一种数据库功能(主要是因为性能原因,我无法从表中检索所有行并在域级别对它们进行排序)。Architecture 在进行域驱动开发时对数据进行排序,architecture,domain-driven-design,Architecture,Domain Driven Design,在开发数据模型时,我没有注意底层数据库级别。我在域类的属性中封装了一些逻辑(例如:计算订单利润的方法)。在我需要对数据进行排序之前,一切都很好。排序纯粹是一种数据库功能(主要是因为性能原因,我无法从表中检索所有行并在域级别对它们进行排序)。 事实证明,我必须重复以前在数据库级别封装在域级别的逻辑(不仅要重复,还要将其转换为数据库语言)。 这似乎很糟糕,我不想做这件事。 有没有办法绕过这个问题 编辑 我正在尝试做的示例: 我的域名: class Order { var lines; pr
事实证明,我必须重复以前在数据库级别封装在域级别的逻辑(不仅要重复,还要将其转换为数据库语言)。
这似乎很糟糕,我不想做这件事。
有没有办法绕过这个问题 编辑
我正在尝试做的示例:
我的域名:
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()方法中已经编写的逻辑)。实际上,我想到了在数据库中存储计算值,而不是计算它们,而不是这样:
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; }
只要确保它是有效的(每次order.lines发生变化时更新它),它就应该可以了。一般的解决方案是在域级别声明您需要的内容,并从中生成相关的数据库代码 你为什么要重复逻辑?您需要对不同的值进行排序吗?你在做什么的一个模拟示例?我已经在我的帖子中添加了一个示例,为什么你不实现一个具有该实现的层呢?我的意思是,您可以使用依赖注入将逻辑与域分离。这正是我已经实现的。现在编写查询既简单又直接。有一点需要注意:我已经使这些对象不可变,以避免可能的数据冲突