使用 DDD 时拥有存储库的好处是,它们允许人们设计域模型而不必担心对象将如何被持久化。它还允许最终产品更加灵活,因为可以轻松地换入和换出存储库的不同实现。因此,存储库的实现可以基于 SQL 数据库、REST Web 服务、XML 文件或任何其他存储和检索数据的方法。从模型的角度来看,期望只有这些魔法集合可用于存储和检索聚合根对象。
现在,如果我有两个正常的内存集合,比如 anIList<Order>
和 an IList<Customer>
,我永远不会期望修改一个集合会影响另一个集合。那么相同的逻辑是否应该适用于存储库?存储库的实际实现是否应该彼此完全隔离,即使它们实际上访问同一个数据库?
例如,可以在SQL数据库中的Customers
表和Orders
表之间建立删除时的级联关系,以便在删除客户时删除相应的订单。但是,如果稍后将SQLCustomerRepository
替换为,此功能将中断RESTCustomerRepository
。
那么我认为模型应该始终假设存储库彼此完全隔离,相应地,存储库的实际实现也应该隔离,这是否正确?
那么 ifOrders
应该在删除时删除 aCustomer
是否应该在域模型中明确定义,而不是依赖数据库?通过CustomerService.DeleteCustomer()
访问当前ICustomerRepository
和的方法说IOrderRepository
。
我想我只是很难摆脱关系世界并进入 DDD 世界。我一直想从表和 PK/FK 关系的角度来思考问题,我应该完全忽略数据库的参与。