我有同样的问题,我想到了以下示例:
想象一个具有以下用例的在线商店应用程序:
用户购买产品
用户编辑他们的个人资料
使用事务脚本,我们将为每个用例创建一个类,每个事务/请求一个函数!
class BuyProduct {
List getProducts(string filter) { /* some database query */ }
void putInCart(int productId, int amount) { ... }
void checkout(...) {...}
}
class EditProfile {
void changePassword(string newpwHash) { ... }
void updatePaymentInfo(...) {...}
}
Run Code Online (Sandbox Code Playgroud)
当没有太多逻辑要实现并且我们只需要一组分组的数据库事务时,这是有道理的!(以及您不需要经常重用代码的地方)
使用领域模型,我们将在领域对象上映射现实。我们将有 User、Product、ShoppingCart、ProductFilter、PaymentInformation 等类,这些类具有执行与类相关的任务的函数。
例如:
class User {
string getPaymentInfo() {...}
void updatePaymentInfo() {...}
}
Run Code Online (Sandbox Code Playgroud)
例如,这些函数可以自己执行数据库查询,也可以将它们委托给持久层。
这种方法对于具有大量逻辑和需要经常重用代码的情况的非常复杂的应用程序很有意义。
带表模块我们可以将数据库表映射到对象。
例如,在这种情况下,可能有产品表、用户表和订单表(跟踪已完成的订单及其状态)的类。不仅表,而且定制的数据库视图和事务/请求都可以映射到类/对象。
一个简单的例子:
class ProductTable {
List getProducts(string filter)
void updateAmountAvailable(int productId, int newAmount) {...} // call after someone bought a product to update it's availability
...
}
Run Code Online (Sandbox Code Playgroud)
这对于在数据库上有大量工作/逻辑的小型应用程序很有意义。但它不能很好地扩展复杂性。
总体:对于小型应用程序,请使用 tansaction 脚本。域模型最适合非常复杂的应用程序。表模块(据我所知)相当不常见,使用 ORM 可能更好。
我希望您参考 Fowler 的同一本书 - http://martinfowler.com/eaaCatalog/
与域模型 (116) 的主要区别在于,如果您有许多订单,则域模型 (116) 每个订单将有一个订单对象,而表模块将有一个对象来处理所有订单。