2012-06-18 24 views
5

मेरी टीम पर प्रोग्रामर कभी-कभी एक लेनदेन खोलते हैं और स्कोप शामिल करना भूल जाते हैं। पूर्ण() कथन (नीचे कोड ब्लॉक देखें)। के तरीकों पर कोई भी विचार या तोसी # - मैं गायब स्कोप के लिए कैसे जांच करूं। पूर्ण() कथन?

(1) scope.Complete लापता के लिए हमारे समाधान() बयान, या

(2) दृश्य स्टूडियो पर प्रकाश डाला या scope.Complete लापता के लिए एक चेतावनी उठाना स्वचालित रूप से (है) बयानों खोज ?

यहाँ लाइन हम याद है:

using(TransactionScope scope = new TransactionScope()) 
{ 
     /* Perform transactional work here */ 
     scope.Complete(); <-- we forget this line 
     /* Optionally, include a return statement */ 
} 

मैं
 
मैं इस उद्देश्य के लिए एक ReSharper कस्टम पैटर्न का उपयोग कर की कोशिश की है, कोई भाग्य के साथ क्या कोशिश की है। आदर्श रूप में मैं की तरह कुछ के लिए खोज करेंगे:

using(TransactionScope scope = new TransactionScope()) 
{ 
    $statements1$ 
    [^(scope.Complete();)] 
    $statements2$ 
} 

हालांकि, ReSharper केवल पहचानकर्ता के लिए नियमित अभिव्यक्ति, बयानों के लिए नहीं स्वीकार करता है, तो यह काम करने के लिए प्रकट नहीं होता है (http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html)।

कोई भी विचार? मैं अन्य प्लगइन्स या टूल्स का उपयोग करने के लिए भी खुला हूं।

धन्यवाद,
बेन

+1

वे अपने कोड का परीक्षण नहीं करते हैं? – Magnus

+0

मैंने इसे परीक्षण के पहले पहले देखा है। प्रतिबिंब के माध्यम से आप यह निर्धारित कर सकते हैं कि किसी उदाहरण पर विधि कहा जाता है या नहीं। यदि ऐसा नहीं है तो परीक्षण विफल रहता है। –

+1

मुझे एनडेंडेंस के साथ लगता है कि आप विधियों की तलाश करने के लिए एक नियम स्थापित कर सकते हैं जहां 'ट्रांज़ेक्शनस्कोप' सीटीओ उपयोग की संख्या 'पूर्ण' उपयोगों की संख्या से कम थी। – AakashM

उत्तर

3

NDepend निश्चित रूप से मदद कर सकते हैं, लेकिन आप के लिए क्या पूछ रहे हैं की 100% की जाँच नहीं कर सकते। NDepend विधि शरीर आंतरिक (विधि कॉल का क्रम) के बारे में नहीं जानता है।

warnif count > 0 
from m in Application.Methods 
where m.CreateA("System.Transactions.TransactionScope") && 
    !m.IsUsing("System.Transactions.TransactionScope.Complete()") 
select m 

ध्यान दें कि डेवलपर्स एक विधि में एक से अधिक TransactionScope बनाने से बचने के लिए पर्याप्त अनुशासित कर रहे हैं: तो सबसे अच्छे रूप में, आप एक code rule over LINQ (CQLinq) कि जाँच करेगा कि यदि एक विधि एक TransactionScope पैदा कर रही है, कम से कम यह TransactionScope.Complete() कॉल करना होगा लिख ​​सकते हैं , यह नियम आपके लिए काम करना चाहिए।

+0

उत्कृष्ट। बहुत बहुत धन्यवाद! –

4

आप निम्न स्तर के scope.Complete सामान के बजाय कोई कस्टम एपीआई का उपयोग करने के लिए प्रोग्रामर के लिए मजबूर कर सकता है?

एक बंद .Complete() के उपयोग के लिए बाध्य करेगा:

public static void Do(this TransactionScope scope, Action action) { 
    using (scope) { 
    action(); 
    scope.Complete(); 
    } 
} 

तो फिर तुम कर सकता है:

new TransactionScope().Do(() => /* Transactional stuff */); 
+0

उत्तर के लिए धन्यवाद! यह सच है, हम आपके मौजूदा लेन-देन को आपके द्वारा लिखे गए कस्टम एपीआई का उपयोग करने के लिए दोबारा कर सकते हैं, और फिर प्रोग्रामर को भविष्य में कोड के लिए इस एपीआई का उपयोग करने के लिए मजबूर करने का प्रयास करें। मुझे लगता है कि कठिन बिंदु सभी लेनदेन को दोबारा शुरू कर देगा, क्योंकि हमारे पास पहले से ही एक बड़ा कोड बेस है। मुझे यकीन नहीं है कि क्या इसमें शामिल समय के लायक होंगे। इसके बारे में सोच रहा है ... –

0

मुझे किसी भी मौजूदा आर # प्लगइन से अवगत नहीं है जो इसके लिए जांच करता है, लेकिन आप निश्चित रूप से अपना स्वयं का बना सकते हैं। आपको बस TransactionScope प्रकार की एक परिवर्तनीय घोषणा के साथ एक उपयोग कथन का पता लगाना है, फिर Complete() कॉल की तलाश में निहित बयानों को फिर से करें।

यदि आप ऐसा करने में रुचि रखते हैं, तो मुझे सलाह है कि आप ReSharper SDK डाउनलोड करें और Plugin Development Guide देखें।

संबंधित मुद्दे