2013-11-23 7 views
9

चलाने के बाद मैं एक वर्ग है कि इस तरह दिखता है:एक विधि को क्रियान्वित करने के लिए कई तरीके

public class SomeClass 
{ 
    public void SomeMethod1() { ... } 
    public void SomeMethod2() { ... } 
    public void SomeMethod3() { ... } 

    private void SomeSpecialMethod(SomeParameter) { ... } 
} 

पल के लिए, मैं पहले 3 तरीकों में से प्रत्येक फोन SomeSpecialMethod() बस से पहले इन विधि मुनाफा होता है। मैं लगभग 15 और विधियों को जोड़ने जा रहा हूं जो अंत में सभी को SomeSpecialMethod() निष्पादित करने की आवश्यकता है और मुझे आश्चर्य है कि कहने का कोई तरीका है "जब इस वर्ग में से कोई भी तरीका चलाता है, निष्पादित करें" स्पष्ट रूप से बिना प्रत्येक विधि के अंत में कॉल दोहराएं और निश्चित रूप से SomeSpecialMethod() को अनन्त रूप से कॉल करने से रोकें।

आपके सुझावों के लिए धन्यवाद। केवल एक निर्माता कि SomeClass की एक वस्तु लेता है और अपने SomeSpecialMethod() कॉल के साथ एक auxuliary नेस्टेड वर्ग (जैसे कि, X) किसी भी क्षेत्रों/तरीकों के बिना की घोषणा की,:

उत्तर

4

आप एओपी - पहलू उन्मुख प्रोग्रामिंग की तलाश में हैं।

सी # इस प्रतिमान का पालन नहीं करता है, लेकिन आप इसकी नकल कर सकते हैं। PostSharp एक विकल्प है, लेकिन मैं कैसल इंटरसेप्टर/बजाय DynamicProxy के साथ जाना चाहते हैं: http://docs.castleproject.org/Windsor.Interceptors.ashx

आप एक इंटरसेप्टर कि आपके वस्तु इर्द-गिर्द घूमती है और अवरोध यह करने के लिए कॉल बनाने की आवश्यकता होगी। रनटाइम पर, कैसल इस इंटरसेप्टर को या तो आपके कंक्रीट क्लास का विस्तार करेगा या एक सामान्य इंटरफ़ेस लागू करेगा - इसका मतलब है कि आप SomeClass को लक्षित करने वाले कोड के किसी भी हिस्से में इंटरसेप्टर इंजेक्ट करने में सक्षम होंगे। आपका कोड कुछ इस तरह दिखेगा:

public class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     //add your "post execution" calls on the invocation's target 
    } 
} 

संपादित

कैसल के साथ AOP का परिचय: http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

इंटरसेप्टर, और सामान्य रूप में AOP, आम तौर पर इस तरह के प्रवेश करने के रूप में चीजों के लिए उपयोग किया जाता है ऑब्जेक्ट की प्रत्येक विधि कॉल का परिणाम, या किसी भी विधि द्वारा फेंक दिया गया अपवाद लॉगिंग।

यदि SomeSpecialMethod के अंदर तर्क अमूर्त है और वास्तव में SomeClass (उदाहरण के लिए लॉगिंग की तरह) से संबंधित नहीं है, तो यह तर्क को इंटरसेप्टर पर ले जाने के लिए समझ में आता है - लेकिन यह आपके ऊपर है।

+0

ठीक है, उत्तर के लिए धन्यवाद; मुझे एओपी के बारे में पता नहीं था। मैं अपने कोड पैटर्न को अभी के लिए छोड़ने जा रहा हूं लेकिन मैं आपका जवाब दिमाग में रखूंगा। – frenchie

1

मैं एक बार ऐसी समस्या का सामना करना पड़ा और इस तरह इसे हल। तब किए गए सभी SomeClass के तरीकों लौटने कि X:

public X SomeMethod1() { 
    ... 
    return new X(this); 
} 
बेशक

, वहाँ एक भूमि के ऊपर है, और आप गैर void तरीकों के साथ ऐसा कर सकते हैं (अच्छी तरह से, आप कर सकते हैं, लेकिन यह बदसूरत मिल जाएगा)।

+1

इस विधि को हर विधि को कॉल करने का क्या फायदा है? दोनों को एक पंक्ति की आवश्यकता होती है (बशर्ते आप कन्स्ट्रक्टर में हैंडलर जोड़ें)। –

+0

@JeroenVannevel स्वयं प्रलेखन, मुझे लगता है? इस 'एक्स' वर्ग को 'गारंटीकृत ToCallSomeSpecialMethodOnReturn' नाम दिया जा सकता है। –

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