DAO模式 - 交易适合哪里?

Bod*_*den 24 dao transactions

所以我有这个通用的DAO事情正在进行,面值似乎没问题.它基本上是在Hibernate人员的CaveatEmptor示例应用程序之后建模的.

最重要的是,我有一个业务层...应用程序的胆量.它完全没有意识到任何特定的DAO实现.

到目前为止,一切似乎都很好,直到我开始考虑交易.如果交易留给客户实施,那么我在世界上如何保持我在各层之间进行的良好分离?也就是说,我现在正在使用Hibernate,而且我真的不太喜欢在我的业务层代码中添加特定于hibernate的事务.

我可以使用begin,commit和rollback方法创建一个简单的事务接口,并将实现传递给我的业务层......但是......我不确定......

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

Nic*_*ier 12

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

您可以尝试在.NET中实现TransactionScope,它可以像这样工作

using (TransactionScope ts = new TransactionScope())
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

它是一样的(不完全是,但如果你是一个Java人,它对你更明确)

TransactionScope scope = new TransactionScope();
try
{
 ...
 scope.Commit();
}
catch(Exception ex)
{
  scope.Rollback();
  throw;
}
Run Code Online (Sandbox Code Playgroud)

要将业务层与任何DAO技术分离,您可以在域语言中添加TransactionFactory,它返回您使用Commit和Rollback方法定义的ITransactionScope(接口).这样你的域层就不会绑定到你的DAO层,只有TransactionFactory的具体实现.

ITransactionScope scope = transactionFactory.CreateTransaction();
try
{
 ...
 scope.Commit();
}
catch(Exception ex)
{
  scope.Rollback();
  throw;
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是重新阅读PoEAA书中关于交易的相关页面(71-77),并且作者建议不要将交易作为业务问题(它们不是*商业语言的一部分,而是*的工具)并发控制*).此外,实际上,几乎涉及业务操作*的每个方法都必须*在系统事务的上下文中运行,即使您通常没有为每个方法分别执行事务.重点仍然是,一个设计良好的应用程序应该*在任何地方都没有明确的事务划分代码,但只能在一个或两个中心位置. (4认同)

Rog*_*rio 7

在Web应用程序中,我划分事务的方法是利用HTTP请求/响应周期,其中每个原子业务操作在一个专用线程中在其中一个周期的范围内执行.

无论使用何种Web框架(Struts,JSF,GWT等),通常都存在可以执行事务划分的"接缝".在Struts中,它可以是一个基本的Action类.在GWT中,它可以是基本的RemoteServiceImpl类.

因此,使用该中心访问点来打开事务(在允许特定于应用程序的代码之前执行),并在没有异常冒泡或其他情况下(在执行特定于应用程序的代码之后)通过提交终止它.

我在一个大型复杂的商业网络应用程序中广泛应用了这一策略,事实证明它非常有效.