9

Я реализует Repository Pattern использования ServiceStack.ORMLite так:Операции в Repository Pattern использование ServiceStack.ORMLite

public class MyRepository : IMyRepository 
{ 
    private IDbConnectionFactory DbConnectionFactory = null; 

    public MyRepository(IDbConnectionFactory dbConnectionFactory) 
    { 
     DbConnectionFactory = dbConnectionFactory; 
    } 

    public void MyMethod() 
    { 
     using (var connection = DbConnectionFactory.OpenDbConnection()) 
     using (var cmd = connection.CreateCommand()) 
     { 
      //Do something here 
     } 
    } 
} 

Но я не знаю, как обращаться с DbTransaction, когда мне нужно, чтобы деформировать некоторые операции БД в DbTransaction. Похоже, TransactionScope - это решение, но я не знаю, слишком ли тяжело для этого.

ответ

10

ServiceStack OrmLite дает вам доступ к классам IDbConnection и IDbTransaction ADO.NET, которые вы должны использовать вместо TransactionScope. Вы можете создать транзакцию, используя IDbConnection.OpenTransaction() метод расширения, например:

public class MyRepository : IMyRepository, IDisposable 
{ 
    private IDbConnectionFactory DbFactory { get; set; } 

    private IDbConnection db; 
    private IDbConnection Db 
    { 
     get { return db ?? (db = dbFactory.Open()); } 
    } 

    public void WithTransactions() 
    { 
     using (var trans = Db.OpenTransaction()) 
     { 
      //Do something here 

      trans.Commit(); 
     } 
    } 

    public List<Poco> WithoutTransactions() 
    { 
     return Db.Select<Poco>(); 
    } 

    public void Dispose() 
    { 
     if (db != null) 
      db.Dispose(); 
    } 
} 

Поскольку это требует меньше коды я предпочитаю инъекцию собственности и использовать свойство Ленивого Db для упрощения модели доступа к данным для моих методов.

Примечание: Всякий раз, когда какой-либо из ваших классов сохраняет ссылку на открытое IDbConnection (как этот), он должен быть зарегистрирован в None/Transient или RequestScope поэтому соединение получает расположенным после использования (то есть Дон» t зарегистрировать его как одноэлементный).

+0

Это моя вина, задавая плохой вопрос ... Я попытаюсь redfine моего вопроса ... –

+0

ли это хорошо, чтобы открыть интерфейс IDbConnection только один раз для каждого запроса и утилизировать после использования? Я думал, что я должен откройте соединение в начале каждого метода и закройте его, когда метод закончен. –

+0

Все в порядке, если вы используете пул соединений (т. Е. Поведение по умолчанию для SqlServer), соединение все равно не закрыто, оно просто выпущено обратно в пул. Но да, в любом случае, хорошо использовать область запроса, поскольку она является однопоточным для каждого запроса, поэтому экземпляр соединения можно безопасно обменивать с другими зависимостями в той же области запроса. – mythz

0

Мне нравится мифология ответа здесь, но у меня возникли проблемы с тем, чтобы заставить работать, как я ожидал бы, основываясь на обратной связи с мифами. Я столкнулся с этим другим ответом, который, поначалу, казался не таким, каким я искал, но на самом деле оказался в правильном направлении.

Best practices of implementing unit of work and repository pattern using ServiceStack.ORMLite

Смежные вопросы