使用注入的iBATIS.NET SQL映射器处理DAO中的事务

时间:2010-09-19 01:58:58

标签: c# .net dao ibatis.net

我目前正在使用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.
    }
}

从我的主要应用程序代码中,假设在某种形式的Business Layer中,我最好在DAO上调用两个insert方法:

// ... Assume DAOs are Initialized.
nodeDAO.InsertNode(node);
nodeRevisionDAO.InsertNodeRevision(nodeRevision);

我想确保两个语句都作为事务中的原子操作执行,这样如果两个语句都失败,它们都将被回滚。但是因为在两个DAO中都注入了ISqlMapper,所以我无法控制事务。

解决这个问题的最佳方法是什么?换句话说,如何在不暴露ISqlMapper的情况下处理事务?

0 个答案:

没有答案