“事务脚本”,“表模块”和“域模型”,以便在业务层中创建业务组件?

问题描述 投票:1回答:2

我正在研究“交易脚本”,“表模块”和“域模型”,但对我来说似乎有些复杂。

能不能给我一个比较这三种方法的例子?

谢谢

.net
2个回答
3
投票

我希望你指的是福勒的同一本书 - http://martinfowler.com/eaaCatalog/

  • 事务脚本主要是程序性的。所以你有一个顺序执行步骤的函数/脚本(每个都会影响一些变化)
  • 域模型是OO并且需要最多的工作 - 您需要提供共享语言和反映域中感兴趣对象的对象模型。
  • 表模块对我来说是新的。它看起来也是OO,除了它更重视DB Schema这一事实.Table-Module-Object看起来像是特定DB表的GateKeeper。主要与DB表中的数据相关联和操作的所有逻辑都存储在相应的TableModuleObject中。引用链接

与域模型(116)的主要区别在于,如果您有许多订单,域模型(116)将为每个订单提供一个订单对象,而表模块将有一个对象来处理所有订单。


1
投票

我有同样的问题,我想到了以下示例:

想象一下具有以下用例的在线商店应用程序:

  1. 用户购买产品 浏览产品 将一个或多个放入购物车 结账(输入付款和运输信息等)
  2. 用户编辑他们的个人资料 更改密码 输入/更新付款信息

使用Transaction Script,每个用例有一个类,每个事务/请求有一个函数!

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(...) {...}
}

当没有太多逻辑要实现并且我们需要的是一组分组数据库事务时,这是有意义的! (并且您不需要经常重用代码)

使用域模型,我们将在域对象上映射现实。我们将拥有User,Product,ShoppingCart,ProductFilter,PaymentInformation等类。这些类具有执行与类相关的任务的函数。

例如:

class User {
  string getPaymentInfo() {...}
  void updatePaymentInfo() {...}
}

这些函数可以自己执行数据库查询,也可以将它们委托给持久层。

这种方法适用于非常复杂的应用程序,它具有大量逻辑和许多您希望经常重用代码的情况。

使用表模块,我们将数据库表映射到对象。

在这种情况下,例如,可以有产品表的类,用户表和订单表(跟踪已完成的订单及其状态)。不仅可以将表,还可以定制数据库视图,还可以将事务/请求映射到类/对象。

一个简单的例子:

class ProductTable {
  List getProducts(string filter)
  void updateAmountAvailable(int productId, int newAmount) {...} // call after someone bought a product to update it's availability
  ...
}

这对于在数据库上具有大量工作/逻辑的小型应用程序是有意义的。但它不能很好地适应复杂性。

总体而言:对于小型应用程序使用事务脚域模型是非常复杂的应用程序的最佳选择。表模块(据我所知)相当罕见,使用ORM可能更好。

© www.soinside.com 2019 - 2024. All rights reserved.