【问题标题】:Simple CRUD in Application Services, DDD way应用服务中的简单 CRUD,DDD 方式
【发布时间】:2015-06-02 17:54:10
【问题描述】:

我是 DDD 的新手,并且已经阅读了很多关于它的内容,但我无法弄清楚这一点。我正在做一个典型的 CRUD 操作(创建),我必须验证一些字段,其余实体保留在我的存储库中。

我知道应用服务,不应该有任何业务逻辑,一个领域实体,不应该直接访问存储库,一个领域服务,可能是最好的选择,但我不知道如何做好。我很困惑。

如何更正下一个代码:

class CustomerApplicationService {

    void AddNew ( CustomerDTO myNewCustomerDTO ) {

        CustomerRepository myCustomerRepo = new CustomerRepository();
        var allCustomers = myCustomerRepo.FindAll();
        for each (Customer c in allCustomers) {
            if (c.SomeField == myNewCustomerDTO.SomeField) {
                // do something, check duplicate data, etc
            }
        }
        var myNewCustomer = new Customer();
        // map myNewCustomer ... fields with myNewCustomerDTO
        myCustomerRepo.Save( myNewCustomer );
    }
}

谢谢!

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    我想这一切都取决于你在“//做某事”那一行上所做的事情。检查重复项并不是真正的领域层问题,因此可以检查您的应用程序层。尽管我不会将您所有的客户都加载到内存中以进行检查。您的存储库可能只有一个 FindByUsername 或 FindByEmail 方法,如果它不返回任何结果,则它不是重复的。简单的验证也是如此,例如检查空值或字符串长度。这种类型的验证进入应用层。仅在有意义的情况下将逻辑放入域模型中,例如当您遇到真正复杂的业务问题并且逻辑不稳定时。像 username is unique 这样的约束并不是真正易变的,因此它不属于您的域模型。

    同样重要的是要记住,仅仅因为您正在“执行 DDD”并不意味着这是您的系统可以使用的唯一工具。如果您只有一个简单的 CRUD 插入,那么只需使用 ADO.NET 或任何最简单的方法进行 CRUD 插入。为真正的复杂性和需要强制执行的不变量保留 DDD。

    总体而言,我认为您的总体方法看起来不错。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2019-03-05
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多