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

时间:2010-05-04 05:46:01

标签: .net

我正在研究“交易脚本”,“表模块”和“域模型”,但它似乎在某种程度上与我相关。

请您举个例子来比较这三种方法吗?

谢谢

2 个答案:

答案 0 :(得分:3)

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

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

与Domain的主要区别   模型(116)是,如果你有很多   订单,域模型(116)将有   每个订单一个订单对象,而a   表模块将有一个对象   处理所有订单。

答案 1 :(得分:0)

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

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

  1. 用户购买产品

    • 浏览产品
    • 将一个或多个放入购物车
    • 结帐(输入付款和运输信息等)
  2. 用户编辑其个人资料

    • 更改密码
    • 输入/更新付款信息

使用交易脚本,我们每个用例都有一个类,每个事务/请求都有一个功能!

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

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

使用域模型,我们可以将现实映射到域对象上。 我们将为用户,产品,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
  ...
}

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

总体: 对于小型应用程序,请使用tansaction脚本。对于非常复杂的应用程序,领域模型是最好的。 (据我所知)表模块并不常见,使用ORM可能更好。