2013-02-20 19 views
9

Tôi đang thực hiện Pattern Repository sử dụng ServiceStack.ORMLite như thế này:Giao dịch trong Pattern Repository sử dụng 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 
     } 
    } 
} 

Nhưng tôi không biết làm thế nào để xử lý DbTransaction khi tôi cần phải warp một số hoạt động DB trong một DbTransaction.It trông giống như TransactionScope là một giải pháp nhưng tôi không biết liệu có quá nặng cho việc này hay không.

Trả lời

10

ServiceStack OrmLite cung cấp cho bạn quyền truy cập vào các lớp học IDbConnectionIDbTransaction của ADO.NET mà bạn nên sử dụng thay vì của TransactionScope. Bạn có thể tạo một giao dịch bằng IDbConnection.OpenTransaction() phương pháp khuyến nông, ví dụ:

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

Vì nó đòi hỏi ít mã tôi thích tiêm sở hữu và sử dụng một tài sản Lazy Db để đơn giản hóa mô hình truy cập dữ liệu cho các phương pháp của tôi.

Lưu ý: Bất cứ khi nào bất kỳ lớp học của bạn giữ một tham chiếu đến một mở IDbConnection (như thế này), nó phải được đăng ký với một None/thoáng hoặc RequestScope để kết nối bị vứt bỏ sau khi sử dụng (ví dụ don' t đăng ký nó như là một singleton).

+0

Đó là lỗi của tôi bằng cách hỏi một câu hỏi xấu ... Tôi sẽ cố gắng redfine câu hỏi của tôi ... –

+0

là nó tốt để mở một IDbConnection chỉ một lần mỗi yêu cầu và xử lý sau khi sử dụng? Tôi nghĩ tôi nên mở kết nối ở đầu mỗi phương thức và đóng nó khi phương thức kết thúc. –

+0

Tốt thôi, nếu bạn đang sử dụng một hồ bơi kết nối (tức là hành vi mặc định cho SqlServer) thì kết nối không thực sự bị đóng, nó chỉ được phát hành trở lại vào hồ bơi. Nhưng cũng có thể sử dụng Yêu cầu Phạm vi vì nó đơn luồng cho mỗi yêu cầu vì vậy một cá thể kết nối có thể được chia sẻ một cách an toàn với các phụ thuộc khác trong cùng phạm vi yêu cầu. – mythz

0

Tôi thích câu trả lời của thần thoại ở đây nhưng đã gặp một số vấn đề khi bản thân mình nhận được những thứ để làm việc như tôi mong đợi dựa trên phản hồi về thần thoại. Tôi chạy qua câu trả lời khác này, lúc đầu, dường như không phải là những gì tôi đang tìm kiếm nhưng thực sự đã kết thúc đưa tôi đi đúng hướng.

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

Các vấn đề liên quan