Обработка транзакций в DAO с помощью внедренного iBATIS.NET SQL Mapper - PullRequest
2 голосов
/ 19 сентября 2010

В настоящее время я использую 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?

...