transactions - DAO 模式 - 交易适合哪里?

标签 transactions dao

所以我已经完成了这个通用的 DAO 事情,从表面上看,它似乎没问题。它基本上是仿照 Hibernate 家伙的 CaveatEmptor 示例应用程序。

最重要的是,我有一个业务层……应用程序的核心。它完全不知道任何特定的 DAO 实现。

到目前为止,一切似乎都很好,直到我开始考虑交易。如果将事务留给客户端来实现,那么我究竟如何保持我在各层之间进行的良好分离?也就是说,我目前正在使用 Hibernate,我不太想将特定于 Hibernate 的事务添加到我的业务层代码中。

我可以使用开始、提交和回滚方法创建一个简单的事务接口(interface),并将实现传递给我的业务层......但是......我不确定......

所以这是一个挑战:你能为我推荐一种不使用 Spring(或 EJB,或任何其他附加框架)这个词的方法吗?

最佳答案

我记得Martin Fowler建议在业务层保持对事务的控制,因为事务是一个业务问题。 (如果您设计一个 BankAccount 类,则事务是域语言的一部分)。

您可以尝试在 .NET 中实现 TransactionScope,它的工作原理类似于

using (TransactionScope ts = new TransactionScope())
{
  ...
}

它与(不完全是,但如果你是 Java 人,它对你来说更明确)是一样的
TransactionScope scope = new TransactionScope();
try
{
 ...
 scope.Commit();
}
catch(Exception ex)
{
  scope.Rollback();
  throw;
}

要将您的业务层与任何 DAO 技术分离,您可以在您的领域语言中添加一个 TransactionFactory,它返回您使用 Commit 和 Rollback 方法定义的 ITransactionScope(一个接口(interface))。这样,您的域层就不会绑定(bind)到您的 DAO 层,只有 TransactionFactory 的具体实现。
ITransactionScope scope = transactionFactory.CreateTransaction();
try
{
 ...
 scope.Commit();
}
catch(Exception ex)
{
  scope.Rollback();
  throw;
}

关于transactions - DAO 模式 - 交易适合哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773393/

相关文章:

python - 如何回滚循环django中的事务

.net - 在数据库外实现事务的模式

domain-driven-design - DDD 中的 DAO、存储库和服务

spring - Spring事务中发生死锁时调度程序停止

api - Paypal 创建沙盒交易

mysql - Hibernate CURRENT_TIMESTAMP 和 MySQL 中的多实体事务

java - 为现有项目设计 DAO 模型

java - 为什么JPA中有这么多接口(interface)?

java - DAOImpl接口(interface)

java - 我可以做这个通用的事情吗?