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