应用服务中的简单CRUD,DDD方式

时间:2015-03-29 19:47:18

标签: domain-driven-design

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

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

如何更正下一个代码:

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

谢谢!

1 个答案:

答案 0 :(得分:2)

我想这一切都取决于你在线上说的是什么" //做某事"。检查重复项实际上并不是域层关注的问题,因此检查应用程序层是一件好事。虽然我不会将所有客户加载到内存中来检查。您的存储库可能只有FindByUsername或FindByEmail方法,如果它没有返回任何结果,那么它不是重复的。同样适用于简单验证,例如检查空值或字符串长度。这种类型的验证在应用程序层中进行。只有在有意义的情况下才将逻辑放入域模型中,例如当您遇到真正复杂的业务问题且逻辑不稳定时。像username这样的约束是唯一的并不是真正的易变性因此它不属于您的域模型。

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

总的来说,我认为你的一般方法看起来很不错。