Domain driven design 应用程序服务中的简单CRUD,DDD方式

Domain driven design 应用程序服务中的简单CRUD,DDD方式,domain-driven-design,Domain Driven Design,我是DDD的新手,读了很多关于它的书,但我不明白这一点。我正在执行一个典型的CRUD操作(Create),我必须根据存储库中保存的其余实体验证一些字段 我知道应用程序服务不应该有任何业务逻辑,域实体不应该直接访问存储库,域服务可能是最佳选择,但我不知道如何做好。我很困惑 如何更正下一个代码: class CustomerApplicationService { void AddNew ( CustomerDTO myNewCustomerDTO ) { Custome

我是DDD的新手,读了很多关于它的书,但我不明白这一点。我正在执行一个典型的CRUD操作(Create),我必须根据存储库中保存的其余实体验证一些字段

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

如何更正下一个代码:

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 );
    }
}

谢谢

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

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

总的来说,我认为你的总体方法看起来不错