2013-02-20 16 views
9

Jestem wykonawczych Repository Wzorzec korzystania ServiceStack.ORMLite tak:Transakcje w repozytorium Wzoru wykorzystujące 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 
     } 
    } 
} 

Ale nie wiem, jak obsługiwać DbTransaction kiedy muszę trochę wypacza działanie DB w DbTransaction. Wygląda na to, że TransactionScope jest rozwiązaniem, ale nie wiem, czy jest na to zbyt ciężki.

Odpowiedz

10

ServiceStack OrmLite daje dostęp do surowych klas IDbConnection i ADO.NET, które należy używać zamiast TransactionScope. Można utworzyć transakcję przy użyciu IDbConnection.OpenTransaction() metodę rozszerzenia, np:

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(); 
    } 
} 

Ponieważ wymaga mniej kodu wolę zastrzyk własności i korzystania z nieruchomości Lazy Db uprościć wzorców dostępu do danych dla moich metod.

Uwaga: Jeśli którykolwiek z klas utrzymuje odniesienie do otwartego IDbConnection (jak ten), powinien być zarejestrowany w Brak/Transient lub RequestScope więc połączenie zostanie umieszczony po użyciu (tzn don” t zarejestrować go jako singleton).

+0

To moja wina, zadając złe pytanie ... Postaram się redfine moje pytanie ... –

+0

Czy to dobrze, aby otworzyć IDbConnection tylko raz na żądanie i usuwane po użyciu? Pomyślałem, że powinienem otwórz połączenie na początku każdej metody i zamknij je, gdy metoda się zakończy. –

+0

Jest w porządku, jeśli używasz puli połączeń (to jest domyślne zachowanie dla SqlServer), to połączenie tak naprawdę nie jest zamknięte, po prostu jest ponownie zwalniane do puli. Ale tak, to jest w porządku, aby używać zakresu wymagań, ponieważ jest jedno-wątkowe na żądanie, więc instancja połączenia może być bezpiecznie udostępniana innym zależnościom w tym samym zasięgu żądania. – mythz