Обработка транзакций в DAO с помощью внедренного iBATIS.NET SQL Mapper

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


person 9ee1    schedule 19.09.2010    source источник
comment
У меня та же проблема с дизайном, за исключением того, что я использую не SQLMapper, а свой собственный интерфейс, который примерно инкапсулирует объект ADO.NET IDbConnection.   -  person dzendras    schedule 16.01.2011
comment
Нашел ответ на мою проблему здесь: stackoverflow.com/questions/773393/   -  person dzendras    schedule 16.01.2011