我目前正在将 iBATIS.NET 用于我正在构建的一个小型应用程序。我喜欢为我的 DAO 创建具体的类,而不是直接使用 ISqlMapper 并调用命名的 SQL 语句。我没有使用任何类型的依赖注入容器,所以理想情况下我的 DAO 设置如下:
public abstract class AbstractDAO
{
/// <summary>
/// SQL Mapper.
/// </summary>
ISqlMapper mapper;
/// <summary>
/// Default Constructor.
/// </summary>
/// <param name="mapper"></param>
public AbstractDAO(ISqlMapper mapper)
{
this.mapper = mapper;
}
}
public class NodeDAO : AbstractDAO
{
/// <summary>
/// Default Constructor.
/// </summary>
/// <param name="mapper"></param>
public NodeDAO(ISqlMapper mapper) : base(mapper) { }
/// <summary>
/// Insert Node.
/// </summary>
/// <param name="node"></param>
public void InsertNode(Node node)
{
// ... Assume Some Pretty Code.
}
}
public class NodeRevisionDAO : AbstractDAO
{
/// <summary>
/// Default Constructor.
/// </summary>
/// <param name="mapper"></param>
public NodeRevisionDAO (ISqlMapper mapper) : base(mapper) { }
/// <summary>
/// Insert Node Revision.
/// </summary>
/// <param name="nodeRevision"></param>
public void InsertNodeRevision(NodeRevision nodeRevision)
{
// ... Assume Some Pretty Code.
}
}
从我的主要应用程序代码中,假设在某种形式的业务层中,理想情况下我会在 DAO 上调用两个插入方法:
// ... Assume DAOs are Initialized.
nodeDAO.InsertNode(node);
nodeRevisionDAO.InsertNodeRevision(nodeRevision);
我想确保两个语句都作为事务中的原子操作执行,以便如果其中一个失败,两个语句都将被回滚。但是因为 ISqlMapper 被注入到两个 DAO 中,所以我无法控制事务。
解决这个问题的最佳方法是什么?换句话说,如何在不暴露 ISqlMapper 的情况下处理事务?