2013-02-20 33 views
9

का उपयोग कर मैं इस तरह ServiceStack.ORMLite का उपयोग कर भंडार पैटर्न को लागू करने हूँ:लेनदेन 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 को संभालने के लिए जब मैं कुछ डीबी आपरेशन ताना करने की जरूरत है पता नहीं है एक डीबीट्रांसक्शन में। ऐसा लगता है कि TransactionScope एक समाधान है लेकिन मुझे नहीं पता कि इसके लिए रास्ता बहुत भारी है या नहीं।

उत्तर

10

ServiceStack OrmLite आपको एडीओ.NET के कच्चे IDbConnection और IDbTransaction कक्षाओं तक पहुंच प्रदान करता है जो आपको ट्रांसएक्शनस्कोप के बजाय उपयोग करना चाहिए।

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.OpenTransaction() विस्तार विधि, उदा का उपयोग करके किसी लेन-देन बना सकते हैं।

नोट: जब भी अपनी कक्षाओं में से किसी के लिए एक संदर्भ रहता है एक खुला IDbConnection (यह एक तरह), यह एक कोई नहीं/क्षणिक या RequestScope तो कनेक्शन उपयोग के बाद निपटारा हो जाता है के साथ पंजीकृत होना चाहिए (यानी डॉन ' इसे सिंगलटन के रूप में पंजीकृत नहीं करें)।

+0

यह ... मैं मेरे सवाल redfine करने की कोशिश करेंगे ... –

+0

यह अच्छा एक IDbConnection अनुरोध के अनुसार केवल एक बार खोलने के लिए और उपयोग के बाद निपटारा करने के लिए है? एक बुरा सवाल पूछकर मेरी गलती है मैंने सोचा कि मैं चाहिए प्रत्येक विधि की शुरुआत में कनेक्शन खोलें और विधि समाप्त होने पर इसे बंद करें। –

+0

यह ठीक है, अगर आप कनेक्शन पूल का उपयोग कर रहे हैं (यानी एसक्लसेवर के लिए डिफ़ॉल्ट व्यवहार) कनेक्शन वास्तव में बंद नहीं है, तो इसे अभी पूल में वापस छोड़ दिया गया है। लेकिन हाँ या तो अनुरोध स्कोप का उपयोग करना ठीक है क्योंकि यह एकल-थ्रेडेड प्रति-अनुरोध है, इसलिए कनेक्शन अनुरोध अन्य अनुरोधों के साथ सुरक्षित अनुरोध को सुरक्षित रूप से साझा किया जा सकता है। – mythz

0

मुझे यहां मिथज़ का जवाब पसंद है, लेकिन मुझे कुछ काम करने में परेशानी हो रही है क्योंकि मैं मिथज़ फीडबैक के आधार पर अपेक्षा करता हूं। मैं इस दूसरे जवाब में भाग गया कि, सबसे पहले, ऐसा नहीं लगता था कि मैं क्या देख रहा था लेकिन वास्तव में मुझे सही दिशा में डाल दिया।

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