我是领域驱动设计的新手,并试图弄清楚应该放在哪里。假设我有一个名为Order的类和一个名为OrderDto的相关DTO。
前端通过传递OrderDto调用OrderController(MVC架构),控制器调用OrderService。
然后我使用OrderRepository从数据库获取Order并使用OrderDto更新Order。假设我想每次计算总计,增值税和小计,客户添加/编辑订单。问题是,DDD应该在哪里进行这些计算。
目前我在服务层执行此操作,但我确定我错过了一些内容。因为每次用户在订单中添加或删除产品时,我都必须手动调用我的重新计算方法。我认为这个计算应该自动完成。所以我没有/需要担心这些计算。
非常感谢任何帮助。
更新1
总之,我们应该把我们的业务规则放在DDD中吗?
答案 0 :(得分:1)
"如果规则因业务需要而存在,则它属于域"
本着DDD的精神,将您的所有计算都放在您的域中。
域名有时被称为"业务层",因为它包含所有相关的业务逻辑/规则。
以下代码是纯DDD的示例。每次添加订单时,总计算都会自动完成,您不必担心忘记明确调用"计算例程"。
public class Order
{
public void AddItem(Item item)
{
// Do add item here
this.CalculateTotal(); // At the end, calculate total.
}
private void CalculateTotal()
{
// Do calculations
this.Total = 0; // after calculations, assign new value;
}
public decimal Total { get; private set; } // notice the "private" setter?
}
你不必担心计算,让你的注意力集中在其他事情上。
如果您需要更改计算,您需要做的就是转到包含业务逻辑的地方。欢迎使用Domain Driven Design ^ _ ^
以下是针对增值税评论的更新代码。
<强> VAT 强>
同样,增值税的计算是在CalculateTotal()
如果增值税取决于每个国家/地区,则只需创建一个具有VAT属性的国家/地区。将Country property置于Customer上,如下所示:
public class Customer
{
public Country Country { get; set; }
}
public class Country
{
public string Name { get; set; } // Country Name
public decimal Vat { get; set; }
}
在CalculateTotal()
中,只需检查客户是否受增值税影响,具体取决于他们所在的国家/地区。
public class Order
{
public void AddItem(Item item)
{
// Do add item here
this.CalculateTotal(); // At the end, calculate total.
}
private void CalculateTotal()
{
// Do calculations
// Get Vat
decimal vat = this.Customer.Country.Vat;
this.Total = 0; // after calculations, assign new value;
}
public Customer Customer { get; set; }
public decimal Total { get; private set; } // notice the "private" setter?
}
如果您打算更改增值税,那么您就知道该去哪里(The Country of course)
增值税的任何变更都将影响该国家/地区内的所有客户。
答案 1 :(得分:0)
我更喜欢创建OrderCaluclate接口和所需的方法,如&#34; calculateTotal&#34;,&#34; calculateVAT&#34;等...然后我创建不同的订单计算并使用策略设计模式我创建了Order和OrderCalculate之间的关系。
通过这种方式,您还可以灵活地进行订单计算,就像某些订单计算所需的其他参数一样。