2008-09-03 17 views
21

क्या किसी ने माइक्रोसॉफ्ट के प्रबंधित एक्सटेंसिबिलिटी फ्रेमवर्क (एमईएफ) के साथ बहुत कुछ किया है? किंडा लगता है जैसे यह सभी लोगों के लिए सभी चीजों की कोशिश कर रहा है - यह एक ऐड-इन प्रबंधक है! यह बतख टाइपिंग है! मैं सोच रहा हूं कि किसी के पास इसका अनुभव सकारात्मक, नकारात्मक है या नहीं।.NET के लिए प्रबंधित एक्स्टेंसिबिलिटी फ्रेमवर्क कहाँ?

हम वर्तमान में हमारी अगली बड़ी परियोजना के लिए एक सामान्य आईओसी कार्यान्वयन एला एमवीसी कोंट्रिब का उपयोग करने की योजना बना रहे हैं। क्या हमें मिश्रण में एमईएफ फेंकना चाहिए?

उत्तर

33

हम एमईएफ को एक उद्देश्य के लिए आईओसी होने का लक्ष्य नहीं रख रहे हैं। एमईएफ के आईओसी पहलुओं के बारे में सोचने का सबसे अच्छा तरीका एक कार्यान्वयन विस्तार है। हम आईओसी को पैटर्न के रूप में उपयोग करते हैं क्योंकि यह उन समस्याओं को हल करने का एक शानदार तरीका है जिन्हें हम हल करना चाहते हैं।

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

कल्पना करें कि जब आप भविष्य में अपना मंच विस्तारित करना चाहते हैं, तो आप बिन फ़ोल्डर में एक डीएल ड्रॉप करते हैं और आप कर चुके हैं। एमईएफ सक्षम ऐप नए एक्सटेंशन के साथ रोशनी करता है। एमईएफ के लिए यह दृष्टि है।

1

यह नियंत्रण कंटेनर का इंजेक्शन नहीं है। यह प्लग-इन समर्थन ढांचा है।

1

मैं कहूंगा कि यह .NET 4.0 फ्रेमवर्क में 'सिस्टम' नेमस्पेस से लटकने जा रहा है कि आप बहुत गलत नहीं जा सकते हैं। यह देखना दिलचस्प होगा कि एमईएफ कैसे विकसित होता है और एमएमएफ की दिशा में हैमिल्टन वेरिसिमो (कैसल) का क्या प्रभाव है।

यह एक बतख की तरह नीम हकीमों हैं, तो यह सिर्फ आईओसी कंटेनर की वर्तमान झुंड का हिस्सा हो सकता ...

8

इस पोस्ट प्रबंधित तानाना फ्रेमवर्क पूर्वावलोकन को संदर्भित करता है 2.

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

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

private IGreetings greetings = CompositionServices.Empty<IGreetings>(); 

कम से कम "कुछ" ऐसे समय जब तक साथ वस्तु भरता है कि के रूप में कंटेनर रचना कोड एक असली "कुछ" के साथ भरने के लिए चलाता है। मुझे नहीं पता - यह विज़ुअल बेसिक के खाली या कुछ भी कीवर्ड की थोड़ी सी चीज़ों को स्मैक नहीं करता है, जिसे मैं हमेशा नापसंद करता हूं। अगर किसी और के पास इस पर कुछ विचार हैं, तो मैं उन्हें सुनना चाहता हूं। शायद यह कुछ है जो मुझे खत्म करने की जरूरत है। यह एक बड़ी वसा [आयात] विशेषता के साथ चिह्नित है, इसलिए ऐसा नहीं है कि यह एक पूर्ण रहस्य या कुछ भी है।

ऑब्जेक्ट जीवनकाल को नियंत्रित करना स्पष्ट नहीं है, लेकिन जब तक आप निर्यातित वर्ग में [compositionOptions] विशेषता जोड़ते हैं, तब तक सबकुछ एक सिंगलटन डिफ़ॉल्ट रूप से नहीं होता है। चलिए आप या तो फैक्टरी या सिंगलटन निर्दिष्ट करते हैं। किसी भी समय इस सूची में पूल किए गए पूल को देखना अच्छा लगेगा।

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

मुझे लगता है कि डायरेक्टपार्टसूची द्वारा लोड किए गए डीएलएल की प्रतिलिपि बनाना छाया का एक अच्छा विचार होगा। एक बार एमईएफ को पकड़ने के बाद डीएलएल बंद कर दिए जाते हैं। यह आपको एक निर्देशिका वॉचर जोड़ने और अद्यतन एडिन को पकड़ने की अनुमति देगा। यह बहुत प्यारा होगा ...

अंत में, मुझे चिंता है कि एडिन डीएलएल कितने भरोसेमंद हैं और कैसे, या यदि एमईएफ आंशिक विश्वास वातावरण में व्यवहार करेगा।मुझे संदेह है कि एमईएफ का उपयोग करने वाले अनुप्रयोगों को पूर्ण विश्वास की आवश्यकता होगी। एडिन को अपने ऐपडोमेन में लोड करना भी समझदार हो सकता है। मुझे पता है कि यह थोड़ा सा सिस्टम smacks। AddIn, लेकिन यह उपयोगकर्ता addins और सिस्टम addins के बीच बहुत स्पष्ट अलगाव की अनुमति होगी।

ठीक है - पर्याप्त ब्लैदरिंग। एमईएफ और सी # में हैलो वर्ल्ड यहाँ है। का आनंद लें!

using System; 
using System.ComponentModel.Composition; 
using System.Reflection; 

namespace HelloMEF 
{ 
    public interface IGreetings 
    { 
     void Hello(); 
    } 

    [Export(typeof(IGreetings))] 
    public class Greetings : IGreetings 
    { 
     public void Hello() 
     { 
      Console.WriteLine("Hello world!"); 
     } 
    } 

    class HelloMEF : IDisposable 
    { 
     private readonly CompositionContainer _container; 

     [Import(typeof(IGreetings))] 
     private IGreetings greetings = null; 

     public HelloMEF() 
     { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
      _container = new CompositionContainer(catalog); 
      var batch = new CompositionBatch(); 
      batch.AddPart(this); 
      container.Compose(batch); 

     } 

     public void Run() 
     { 
      greetings.Hello(); 
     } 

     public void Dispose() 
     { 
      _container.Dispose(); 
     } 

     static void Main() 
     { 
      using (var helloMef = new HelloMEF()) 
       helloMef.Run(); 
     } 
    } 
} 
+1

मैं हाल ही में MEF पूर्वावलोकन 4 के साथ खेला है, और वे कुछ हद तक कोड साफ कर लिया है। AggregatingComposablePartCatalog अब सिर्फ कुल सूची है, इत्यादि। आईएमएचओ की एक बड़ी जीत के आसपास –

2

एंडी, मेरा मानना ​​है कि ग्लेन ब्लॉक लोगों के कई जवाब देता है (प्राकृतिक) पर MSDN MEF फोरम इस सूत्र अप में इस तरह के सवाल:

Comparison of CompositionContainer with traditional IoC Containers

एक डिग्री के लिए, ऊपर आर्टम का उत्तर एमईएफ के पीछे प्राथमिक मंशा के सापेक्ष सही है, जो विस्तारशीलता और संरचना नहीं है। यदि आप मुख्य रूप से संरचना में रूचि रखते हैं, तो अन्य सामान्य आईओसी संदिग्धों में से एक का उपयोग करें। यदि, दूसरी तरफ, आप मुख्य रूप से विस्तारशीलता से संबंधित हैं, फिर कैटलॉग, भागों, मेटाडेटा टैगिंग, बतख टाइपिंग का परिचय, और कुछ रोचक संभावनाओं के लिए सभी को लोड करने में देरी हो रही है। इसके अलावा, Krzysztof Cwalina ME12 और System.Addins कैसे एक दूसरे से संबंधित है, यह बताते हुए here पर एक शॉट लेता है।

4

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

4

डक टाइपिंग वी 1 में नहीं चलेगा हालांकि यह वर्तमान बूंद में है। भविष्य में गिरावट में हम इसे एक प्लग करने योग्य एडाप्टर तंत्र के साथ बदल देंगे जहां कोई बतख टाइपिंग तंत्र में हुक सकता है। बतख टाइपिंग पर हमने जो कारण देखा वह संस्करण परिदृश्यों को संबोधित करना है। डक टाइपिंग के साथ आप निर्यातकों और आयातकों के बीच साझा संदर्भों को हटा सकते हैं, इस प्रकार एक अनुबंध के कई संस्करणों को एक तरफ रहने की इजाजत दे सकते हैं।

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