2009-08-20 6 views
6

कुछ दिन पहले, मैंने CoClassAttribute को इस तरह इस्तेमाल किया था जिस तरह से मैंने पहले कल्पना नहीं की थी।"न्यूइंग अप" इंटरफेस


[ComImport, CoClass(typeof(Foo)), Guid("787C1303-AE31-47a2-8E89-07C7257B1C43")] 
interface IFoo { 
    void Bar(); 
} 

class Foo : IFoo { 
    public void Bar() { 
     Console.WriteLine("Oh retado!"); 
    } 
} 

के रूप में इस्तेमाल किया जा रहा:


class CoClassDemo { 
    public static void Show() { 
     var a = new IFoo(); 
     a.Bar(); 
    } 
} 

जो मुझे हैरान नहीं होना चाहिए था के बाद से COM इंटरॉप .NET फ्रेमवर्क के शुरुआती दिनों से ठीक नहीं है। .NET परावर्तक में COM इंटरऑप कोड के माध्यम से खोदने पर मैंने बस इतना ध्यान नहीं दिया है।


method public hidebysig static void Show() cil managed 
{ 
    .maxstack 1 
    .locals init (
     [0] class ConsoleApplication1.IFoo a) 
    L_0000: nop 
    L_0001: newobj instance void ConsoleApplication1.Foo::.ctor() 
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance void ConsoleApplication1.IFoo::Bar() 
    L_000d: nop 
    L_000e: ret 
} 

क्या हुआ कि COM Interop के संदर्भ से बाहर, मैं तुरंत मैं इस एक गरीब आदमी का संकलन समय निर्भरता इंजेक्शन के रूप में इस्तेमाल किया जा रहा कल्पना है।

सभी (COM इंटरॉप करता है) करने के लिए पारंपरिक "मैं" इंटरफेस के नाम पर उपसर्ग से छुटकारा पाने जाती है।

तो यह CoClass विशेषता को बदलने के किसी अन्य के लिए एक कार्यान्वयन स्वैप करने के लिए, मजाक की बात, आदि होगा

दो कमियां मैं देख रहा हूँ अग्रिम पुन: संयोजित करने के लिए कर रहे हैं (जो विकास समय पर काफी सीमा परीक्षण परिदृश्यों) और परिपत्र निर्भरताओं के आस-पास की समस्याएं जब विभिन्न असेंबली में इंटरफेस और कार्यान्वयन तैनात किए जाते हैं।

क्या कोई इस तकनीक के साथ खेला है? कोई अन्य कमी? अन्य उपयोग?

+8

कभी हाईस्कूल में दुकान कक्षा लेते हैं? "सही नौकरी के लिए सही उपकरण का प्रयोग करें।" COM इंटरऑप के लिए पूरी तरह से और पूरी तरह से अलग करने के लिए डिज़ाइन किए गए टूल का उपयोग करना एक बुरा विचार है। इससे आपके कोड को अगले व्यक्ति के लिए समझना असंभव हो जाता है जिसे इसे बनाए रखना है। याद रखें, अगला लड़का शायद आप ही होगा, आप भूल गए हैं कि आपने यह पागल चीज़ क्यों की है। –

उत्तर

10

मुझे पता है कि सप्ताहांत पर कम से कम दो ब्लॉग पोस्ट प्राप्त हुए - mine और Ayende's

सबसे कोड के लिए, यह एक जिज्ञासा के रूप में केवल व्यवहार किया जाना चाहिए। मुझे लगता है कि यह निर्भरता इंजेक्शन के लिए इसका उपयोग करने का दुर्व्यवहार होगा, जब स्थापित आईओसी/डी ढांचे काम को इतना बेहतर कर सकते हैं, और इतनी आसानी से।

विशेष रूप से, इस दृष्टिकोण §17.5 के भागने हैच पर निर्भर करता है, कल्पना के लिए किसी Microsoft-विशिष्ट एक्सटेंशन ... आप अपने कोड मोनो पर चलने के लिए करना चाहते हैं? मैंने कोशिश नहीं की है, लेकिन कोई विशिष्ट कारण है कि इसे gmcs/dmcs के अंतर्गत संकलित करना चाहिए।

जॉन को कंक्रीट कोड में इसका उपयोग करने के लिए better example था - जानबूझकर COM को मॉक करने के लिए, लेकिन यह .NET 4.0/dynamic के साथ टकरा रहा था। फिर; यह अधिकांश "नियमित" कोड पर लागू नहीं होगा।

तो नहीं; यह नहीं करें - यह सिर्फ एक मजेदार है।

+0

अभी के लिए, मैं इसे जिज्ञासा के रूप में भी देखता हूं। मैं अभी भी अपने सिर में पृष्ठभूमि धागे में इस जानकारी की प्रसंस्करण कर रहा हूं और मुझे अभी भी यह जानने में दिलचस्पी है कि इस तकनीक के किसी अन्य "रचनात्मक" उपयोग हैं या नहीं। –