2013-07-23 7 views
5

मैं वर्षों से एओपी के साथ खेल रहा हूं, लेकिन समाधान से 100% संतुष्ट नहीं हुआ। स्प्रिंग.एओपी जैसे रनटाइम बुनाई के साथ एओपी फ्रेमवर्क, कक्षा के इंटरफेस को बदल नहीं सकते हैं। पोस्ट संकलन समय के साथ पोस्टशर्प जैसे फ्रेमवर्क (कोई और किसी और को जानता है?) आप कर सकते हैं। इस नमूना को देखें, यह आपके वर्ग में INotifyPropertyChanged कार्यान्वयन जोड़ता है। ->http://www.postsharp.net/model/inotifypropertychangedएओपी पूर्व-संकलन समय बुनाई?

यह AOP सुविधा वास्तव में महान है, लेकिन आप बहुत जल्द ही मुसीबतों में चलाने ... आप होस्टिंग विधानसभा के भीतर नए इंटरफ़ेस उपयोग करना चाहते हैं, तो आप संकलन नहीं कर सकते, क्योंकि इंटरफ़ेस संकलन के बाद जोड़ा जाता है । ताकि आपको "PropertyChanged परिभाषित नहीं किया गया" -error। तो आपको कक्षाओं को किसी अन्य असेंबली में अलग करके, बदसूरत काम करना होगा, ताकि आप उन एओपी फायदों का उपयोग कर सकें। मुझे याद है, मैं एक ही "पोस्ट संकलन समय" में भाग गया - एक टी 4-टेम्पलेट का उपयोग कर परेशानी जो एक असेंबली के प्रतिबिंबित इन्फोस के आधार पर स्रोत कोड उत्पन्न करती है। ठीक है तो संकलन समय पोस्ट कभी-कभी बहुत देर हो जाती है ...

जो मैं खोज रहा हूं वह एक समाधान है, जहां कक्षा के स्रोत कोड को विजुअल स्टूडियो उपयोगकर्ता परिभाषित टूल के माध्यम से पार्स किया जाता है, फिर अंडर कोड को सी # एक आंशिक वर्ग में फ़ाइल। (इसलिए सभी एओपी लागू वर्गों को आंशिक होना चाहिए)

तो इसकी तरह "प्री-कंपाइल-टाइम एओपी"। यह निश्चित रूप से संभव होना चाहिए, और कोड पारसर के रूप में एनआरफैक्टरी का उपयोग करके किया जा सकता है। इसके अलावा, विजुअल स्टूडियो एक संकलन संशोधन के मुकाबले इसे और अधिक पसंद करेगा।

तो यह समाधान पोस्ट संकलन समय बुनकरों के नुकसान को समाप्त करता है। लेकिन आपको एओपी की सभी सुविधाएं नहीं देती हैं। लेकिन एक एओपी-फ्रेमवर्क के साथ, यह अजीब होना चाहिए।

क्या कोई इस तरह के ढांचे को जानता है, या कोई चर्चा? आपको क्या लगता है?

तरह का संबंध, थॉमस

उत्तर

0

PostSharp के मामले में, आप एक इंटरफेस के बाद संकलन समय में शुरू की विधि Post.Cast, जो डाली ऑपरेटर का एक प्रकार है कि बाद के संकलन पर सत्यापित है, है का उपयोग करके उपयोग कर सकते हैं -पहर। दस्तावेज के लिए http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/M_PostSharp_Post_Cast__2.htm देखें।

+0

धन्यवाद, IMHO यह आर्किटेक्चर पर एक प्रभाव है, क्योंकि आप अपने कोड में जटिलता (= एक कास्ट) जोड़ते हैं। क्या यह उन बिंदुओं में से एक है जिन्हें आपने एंडर्स हेजल्सबर्ग से "कंपाइलर खोलने" के लिए कहा था? उद्धरण: "कोड अनुबंध से लोगों ने शायद संकलक को हुक करने की क्षमता की सराहना की होगी। इस आवश्यकता को बड़े पैमाने पर अनदेखा किया जा रहा है।" स्रोत: http://www.postsharp.net/blog/post/Anders-Hejlsberg-Dead-Body –

1

क्योंकि आप और मैं पहले से ही SNAP का उपयोग व्यवहार्य विकल्प के रूप में करने के लिए पहले से ही संबंधित हैं, मैंने सोचा कि मैं उन लोगों के लाभ के लिए यहां हमारी चर्चा का सारांश पोस्ट करूंगा जो समान समाधान की तलाश में हैं।

संक्षेप में, SNAP रनटाइम एओपी फ्रेमवर्क प्रदान करता है जो आपके कोड को किसी भी तरह से नहीं बदलता है। कोई पोस्ट-कंपाइल चरण नहीं है, केवल रनटाइम इंटरसेप्शन है जो अनुमानित और उपयोग करने में आसान है।

+0

धन्यवाद, मुझे लगता है कि दोनों विकल्प, स्थिर बुनाई और रनटाइम डी बहुत अच्छे उपकरण हैं। व्यक्तिगत रूप से मुझे स्थिर बुनाई पसंद है, क्योंकि इसमें कम वास्तुकला प्रभाव है। बेशक, DI के साथ आपके पहलुओं पर अधिक नियंत्रण है। लेकिन एसएनएपी पर बधाई, आपने एक महान परियोजना बनाई है :) –

1

आप क्या देख रहे हैं pMixins है। यह अभी भी बीटा में है, लेकिन यह वही करता है जो आप खोज रहे हैं: डिज़ाइन-टाइम बुनाई। एओपी कोड आंशिक कोड-बैक क्लास में उत्पन्न होता है, इसलिए यह डिज़ाइन-टाइम पर उपलब्ध होता है।

तो यह मतलब है कि आप एक फ़ाइल में ऐसा कर सकते हैं और संकलक खुश है, दृश्य स्टूडियो खुश है, ReSharper खुश है:

public interface ISomeInterface 
{ 
    void SomeMethod(); 
} 

इंटरफेस के एक कार्यान्वयन बनाएँ:

एक इंटरफेस को परिभाषित करें (मैं इस एक Mixin कहते हैं):

:

public class SomeInterfaceImplementation : ISomeInterface 
{ 
    public void SomeMethod() 
    { 
     //implementation 
    } 
} 

एक लक्ष्य फ़ाइल (जो Mixin की खपत होगी) को परिभाषित करें

public class Utility 
{ 
    public void DoSomeWorkOnSomeInterface(ISomeInterface obj) 
    { 
     obj.SomeMethod(); 
    } 

    public void DoSomeWorkOnImplementation(SomeInterfaceImplementation obj) 
    { 
     obj.SomeMethod(); 
    } 
} 

और अब यह सभी एक साथ काम देखते हैं:

[pMixin(Mixin = typeof(SomeInterfaceImplementation))] 
public partial class Target { } 

के एक उपयोगिता वर्ग कि SomeInterface और SomeInterfaceImplementation साथ काम करता है बनाएँ

class Program 
{ 
    private static void Main(string[] args) 
    { 
     //Call the mixed in method 
     new Target().SomeMethod(); 

     //Target implements ISomeInterface is code-behind 
     new Utility().DoSomeWorkOnSomeInterface(new Target()); 

     //Target has an implicit conversion operator to 
     //SomeInterfaceImplementation in code-behind 
     new Utility().DoSomeWorkOnImplementation(new Target()); 
    } 
} 

कारण यह काम करता है क्योंकि जैसे ही आप के रूप में फ़ाइल को सहेजें, pmixins कोड जेनरेटर तुरंत डिज़ाइन-टाइम बुनाई करता है और कोड-बैक फ़ाइल अपडेट करता है। यह SomeMethod को सीधे Target पर जोड़ता है, Target की ISomeInterface को लागू करने के लिए कक्षा परिभाषा अद्यतन करता है और रूपांतरण ऑपरेटर बनाता है।

प्रकटीकरण: मैं पीएमक्सिन विकास टीम पर हूं।

+0

बीटीडब्लू @ गेल-फ्रैटेर - पोस्टशर्प एक अच्छा टूल है और क्या मुझे सीओ में एओपी पर बदल गया है! –

+0

@ थॉमस हेलर - आप अपने सुझाव के साथ बिल्कुल सही हैं कि यह एनआरफैक्टरी के साथ किया जा सकता है। यही वही है जो मैंने उपयोग किया था! –

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