据我了解,主要要点是将域逻辑(业务逻辑)与基础结构(数据库,文件系统等)分开。
这是造成误解的基础:DDD的目的不是沿着诸如“这是在SQL Server中,所以一定不能是BL”之类的硬线分离事物,DDD的目的是分离域并在两者之间创建障碍它们允许一个域的内部结构与另一个域的内部结构完全分开,并在它们之间定义共享的外部结构。
不要将“存在于SQL中”视为BL / DL障碍-事实并非如此。而是将“这是内部领域的终结”视为障碍。
每个域都应该具有允许其与所有其他域一起使用的面向外部的API :对于数据存储层,它应该对其存储的数据对象具有读/写(CRUD)操作。这意味着SQL本身并不是真正的障碍,而VIEW
and PROCEDURE
组件则是。您永远不要直接从表中阅读:这是DDD告诉我们的实现细节,作为外部使用者,我们不必担心。
考虑您的示例:
我想知道的是,当我遇到非常复杂的查询(例如材料资源计算查询)时会发生什么?在这种查询中,您需要使用繁重的集合操作,这是SQL设计的目的。
这正是SQL中应有的功能,并且不违反DDD。这就是我们为DDD做的。与SQL该计算,即变成部分的BL / DL的。您将要做的是使用单独的视图/存储过程/您拥有什么,并将业务逻辑与数据层分开,因为这是您的外部API。实际上,您的数据层应该是另一个DDD域层,其中您的数据层拥有自己的抽象来与其他域层一起工作。
在基础架构中也无法进行这些计算,因为DDD模式允许在基础架构中进行更改而无需更改域层,并且知道MongoDB不具有SQL Server等相同的功能,这是不可能发生的。
那是另一个误解:它说内部的实现细节可以更改而无需更改其他域层。并不是说您可以替换整个基础架构。
再次提醒您,DDD是关于使用定义良好的外部API隐藏内部组件。这些API的位置是完全不同的问题,DDD对此没有定义。它只是简单地定义了这些API的存在,并且绝不应更改。
DDD的设置不允许您用MongoDB临时替换MSSQL,这是两个完全不同的基础结构组件。
取而代之的是,让我们使用DDD定义的类比:汽油车与电动车。两种车辆都有两种完全不同的产生推进力的方法,但是它们具有相同的API:开/关,油门/制动器和推动车辆的车轮。DDD表示,我们应该能够更换汽车中的发动机(汽油或电动)。并不是说我们可以用摩托车代替汽车,这实际上就是MSSQL→MongoDB。