2011-02-10 16 views
11

मेरे पास एक प्रणाली है जो भागों को लोड करने के लिए एमईएफ का उपयोग करती है। इनमें से प्रत्येक भाग कोर लाइब्रेरी पर भरोसा करता है। इसके अलावाएमईएफ निर्भरता और संस्करण

  • part1-1.0.0.0.dll
  • part2-1.0.0.0.dll

,: जब मैं इस परियोजना का निर्माण, मैं इस तरह .dll फ़ाइलों के लिए एक संस्करण संख्या को जोड़ने एक ऐसा एप्लीकेशन है जो एमईएफ संरचना करता है। यह कोर लाइब्रेरी का भी उपयोग करता है। मैंने पाया है कि मैं केवल "भाग" डीएलएस को तैनात कर सकता हूं, और रचना ठीक काम करती है क्योंकि एप्लिकेशन पहले ही कोर लाइब्रेरी को लोड कर चुका है जिस पर भाग भरोसा करते हैं।

  • /parts/part1-v1.dll
  • /parts/part2-v1.dll
  • संगीतकार-v1.exe
  • कोर-v1.exe: तो मेरी फाइल सिस्टम इस तरह दिखता है

मेरी समस्या यह है कि कोर और भागों के संस्करण को कैसे संभालना है। मान लीजिए कि मैं कोर, और भागों में से एक को अद्यतन करता हूं। फिर, मैं परिवर्तनों को तैनात करता हूं।

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • संगीतकार: तो अब मेरी फाइल सिस्टम की तरह कुछ लग सकता है -v1.exe
  • कोर-v1.dll
  • कोर-v2.dll

मुझे यकीन है कि part1-v1.dll कोर-v1.dll, और part1-v2.d का उपयोग करता है बना सकते हैं कैसे कोर-v2.dll का उपयोग करेंगे? मुझे भागों के सभी संस्करणों को लोड करने और कोर के उपयुक्त संस्करण का उपयोग करने की आवश्यकता है।

[Export(typeof(IPart))] 
public class Part1 
{ 
    public string GetSomethingFromCore() 
    { 
     return Core.GetSomethingFromCore(); 
    } 
} 

[Export(typeof(IPart))] 
public class Part2 
{ 
    public string GetSomethingFromCore() 
    { 
     return Core.GetSomethingFromCore(); 
    } 
} 

उत्तर

5

आपकी समस्या का ख्याल रखना नहीं strong naming है:

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

वैकल्पिक रूप से, यदि मजबूत नामकरण बहुत प्रतिबंधित है, तो आप संस्करण संख्याओं को प्रकार के नामों में डाल सकते हैं। उदाहरण के लिए:

[Export(typeof(IPart))] 
public class Part1v1 
{ 
    private readonly ICorev1 core; 

    [ImportingConstructor] 
    public Part1v1(ICorev1 core) 
    { 
     this.core = core; 
    } 
} 

[Export(typeof(IPart))] 
public class Part1v2 
{ 
    private readonly ICorev2 core; 

    [ImportingConstructor] 
    public Part1v2(ICorev2 core) 
    { 
     this.core = core; 
    } 
} 
+3

मैं इस दृष्टिकोण को वापस लेगा। ध्यान दें कि कैसे विम ने इंटरफेस के लिए 'कोर' कार्यक्षमता को सारणीबद्ध किया है, यह विशेष रूप से महत्वपूर्ण है क्योंकि लांस के दिए गए उदाहरण में, वह 'कोर' को संदर्भित करता है, इसलिए भाग 1 और भाग 2 वास्तव में अलग-अलग स्थिर सिंगलटन का संदर्भ दे रहा है, जो आम तौर पर नहीं होगा अपेक्षित् व्यवहार। इंटरफ़ेस की कार्यक्षमता को सारणीबद्ध करके, 'कोर' तर्क वास्तव में सिंगलटन _instances_ हो सकते हैं, वही ऑब्जेक्ट, जो इंटरफेस के दो अलग-अलग संस्करण (आईसीओआरवी 1, और आईसीओआरवी 2) के माध्यम से कार्यक्षमता प्रकाशित करता है। – Adam

+0

सभी माइक्रोसॉफ्ट ऑफिस इंटरऑप असेंबली पर एक नज़र डालें, और ध्यान दें कि उनके पास v8, v9, v10 dlls आदि (नामस्थान में संस्करण के साथ) कैसे हैं। प्रत्येक नए संस्करण _does_not_ अंतिम से कार्यक्षमता को फिर से परिभाषित करता है, लेकिन बस _adds_ पर।) ICorev1, ICorev2 { ICorev1.GetSomethingFromCore ( {} ICorev2.GetSomethingFromCore2 (: आंतरिक वर्ग कोर: तो, एक रखरखाव के नजरिए से, अपने 'कोर' कार्यान्वयन (समय के साथ) इस (स्यूडोकोड) कुछ ऐसा दिखाई देगा) {} } – Adam

1

आप अपने कोर विधानसभा देना अपने भागों strong names के सभी की जरूरत है, तो वे जब संदर्भित विधानसभाओं लोड करने में एक सटीक मिलान की आवश्यकता होगी। इसका मतलब यह भी है कि आपको अपनी मूल असेंबली की कई प्रतियां तैनात करने की आवश्यकता होगी। अर्थात। बजाय

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • संगीतकार-v1.exe
  • कोर की -v1।dll
  • कोर-v2.dll

आप होगा:

  • /parts/1-1/part1-v1.dll
  • /भागों/1-1/कोर-v1 .dll
  • /parts/1-2/part1-v2.dll
  • /parts/1-2/core-v2.dll
  • /parts/2-1/part2-v1.dll
  • /parts/2-1/core-v1.dll
  • संगीतकार-v1.exe
  • कोर-v1.dll
  • कोर-v2.dll

तरह से मुझे लगता है कि किया है अतीत में, बस प्रत्येक भाग को अलग-अलग फ़ोल्डर में स्टोर करने के लिए आवश्यक सभी निर्भरताओं के साथ स्टोर करना है। भले ही वे (वर्तमान में) एप्लिकेशन में समान संस्करण हैं। ताकि जब आप कोर-वी 2 पर आवेदन करते हैं, तो कोर-वी 1 पर निर्भर सभी हिस्सों में अभी भी यह होगा।

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