域驱动的设计行为和服务

时间:2014-03-19 10:42:35

标签: asp.net-mvc design-patterns domain-driven-design repository-pattern

我是领域驱动设计的新手,并试图弄清楚应该放在哪里。假设我有一个名为Order的类和一个名为OrderDto的相关DTO。

前端通过传递OrderDto调用OrderController(MVC架构),控制器调用OrderService。

然后我使用OrderRepository从数据库获取Order并使用OrderDto更新Order。假设我想每次计算总计,增值税和小计,客户添加/编辑订单。问题是,DDD应该在哪里进行这些计算。

  1. 在服务层中作为私有方法(如RecalculateTotal)或在辅助类中作为静态方法
  2. 在行为类
  3. 在域内(类成员设置者)
  4. 目前我在服务层执行此操作,但我确定我错过了一些内容。因为每次用户在订单中添加或删除产品时,我都必须手动调用我的重新计算方法。我认为这个计算应该自动完成。所以我没有/需要担心这些计算。

    非常感谢任何帮助。

    更新1
    总之,我们应该把我们的业务规则放在DDD中吗?

2 个答案:

答案 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之间的关系。

通过这种方式,您还可以灵活地进行订单计算,就像某些订单计算所需的其他参数一样。