अगर कोई क्लास IDisposable इंटरफ़ेस लागू करती है, तो जब भी किसी इंस्टेंस की ज़रूरत न रहे, उसके Dispose() मेथड को कॉल करना ज़रूरी है। आम तौर पर यह काम किसी catch या finally क्लॉज़ से किया जाता है, या फिर किसी कॉलर के Dispose() रूटीन से। Dispose() से यह मौका मिलता है कि ऑपरेटिंग सिस्टम के ऑब्जेक्ट जैसे अनमैनेज्ड संसाधन (जिन्हें .NET रनटाइम मैनेज नहीं करता) मुक्त हो सकें और मैनेज्ड संसाधनों की आंतरिक स्थिति रीसेट हो सके।
आप एक ORM (ऑब्जेक्ट रिलेशनल मैपिंग) सिस्टम बना रहे हैं, जो किसी दूसरी टीम द्वारा उपलब्ध कराए गए डेटाबेस पर काम करता है।
डेटाबेस एक समय में एक ही ट्रांज़ैक्शन संभाल सकता है।
इस स्तर पर लॉगिंग या किसी और तरह की एरर हैंडलिंग की ज़रूरत नहीं है।
ध्यान दीजिए कि अंदरूनी रूप से डेटाबेस कई स्थितियों से गुज़रता है: Closed, TransactionStarted, DataWritten, Invalid, Closed। आप यह मान सकते हैं कि हर अभ्यास की शुरुआत में डेटाबेस Closed स्थिति में होता है।
डेटाबेस में ये इंस्टेंस मेथड हैं:
Database.BeginTransaction() डेटाबेस पर एक ट्रांज़ैक्शन शुरू करता है। अगर इसे तब कॉल किया जाए जब डेटाबेस Closed स्थिति में न हो, तो एक्सेप्शन फेंका जाता है। सफल होने पर डेटाबेस की अंदरूनी स्थिति TransactionStarted हो जाती है।Database.Write(string data) ट्रांज़ैक्शन के अंदर डेटाबेस में डेटा लिखता है। अगर इसे खराब डेटा मिलता है तो एक्सेप्शन फेंका जाता है। अगर BeginTransaction() कॉल किए बिना इस मेथड को कॉल करने की कोशिश की जाए, तो भी एक्सेप्शन फेंका जाएगा। सफल होने पर डेटाबेस की अंदरूनी स्थिति DataWritten हो जाती है।Database.EndTransaction() ट्रांज़ैक्शन को डेटाबेस में स्थायी रूप से सहेज देता है। अगर यह ट्रांज़ैक्शन बंद नहीं कर पाता या Database.BeginTransaction() कॉल नहीं किया गया था, तो यह एक्सेप्शन फेंक सकता है।Database.Dispose() को कॉल करने से डेटाबेस की सफाई हो जाती है। इससे डेटाबेस की स्थिति Closed हो जाती है।डेटाबेस की स्थिति database.DbState से देखी जा सकती है।
डेटाबेस की स्थिति इनमें से किसी एक पर सेट की जा सकती है:
डेटाबेस पर ट्रांज़ैक्शन शुरू करने के लिए Orm.Begin() लागू कीजिए। अगर डेटाबेस की शुरुआती अंदरूनी स्थिति State.Closed नहीं है, तो यह InvalidOperationException फेंकता है।
var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted
डेटाबेस में थोड़ा डेटा लिखने के लिए Orm.Write() लागू कीजिए। अगर डेटाबेस की शुरुआती अंदरूनी स्थिति State.TransactionStarted नहीं है, या खराब डेटा लिखा जाता है, तो InvalidOperationException फेंका जाता है। अगर लिखना असफल हो जाए, तो Orm को डेटाबेस की सफाई करनी चाहिए।
var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed
डेटा को स्थायी रूप से सहेजने के लिए Orm.Commit() लागू कीजिए। अगर सहेजना असफल हो जाए, तो डेटाबेस की सफाई कीजिए। अगर डेटाबेस की शुरुआती अंदरूनी स्थिति State.DataWritten नहीं है, तो InvalidOperationException फेंका जाता है।
var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed
Orm क्लास पर IDisposable इंटरफेस लागू कीजिए। इस कॉल के सफल होने की गारंटी है।
var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।