2012-01-25 9 views
9

मुझे सिंगलटन पैटर्न और एमईएफ के बारे में एक प्रश्न है। मैं एमईएफ प्लगइन्स को लागू करने में नया हूं और मुझे कोई जवाब नहीं मिला है।सी # सिंगलटन पैटर्न और एमईएफ

क्या एमईएफ लागू प्लगइन के माध्यम से कक्षा का केवल एक उदाहरण प्रदान करना संभव है?


    #region Singleton 
    /// 
    /// This class provide a generic and thread-safe interface for Singleton classes. 
    /// 
    /// The specialized singleton which is derived 
    /// from SingletonBase<T> 
    public abstract class Base where T : Base 
    { 
    /* the lock object */ 
    private static object _lock = new object(); 

    /* the static instance */ 
    private static T _instance = null; 
    /// 
    /// Get the unique instance of . 
    /// This property is thread-safe! 
    /// 
    public static T Instance 
    { 
     get 
     { 
     if (_instance == null) 
     { 
      lock (_lock) 
      { 
      if (_instance == null) 
      { 
       /* Create a object without to use new (where you need a public ctor) */ 
       object obj = FormatterServices.GetUninitializedObject(typeof(T)); 
       if (obj != null) // just 4 safety, but i think obj == null shouldn't be possible 
       { 
       /* an extra test of the correct type is redundant, 
       * because we have an uninitialised object of type == typeof(T) */ 
       _instance = obj as T; 
       _instance.Init(); // now the singleton will be initialized 
       } 
      } 
      } 
     } 
     else 
     { 
      _instance.Refresh(); // has only effect if overridden in sub class 
     } 
     return _instance; 
     } 
    } 


    /// 
    /// Called while instantiation of singleton sub-class. 
    /// This could be used to set some default stuff in the singleton. 
    /// 
    protected virtual void Init() 
    { } 

    /// 
    /// If overridden this will called on every request of the Instance but 
    /// the instance was already created. Refresh will not called during 
    /// the first instantiation, for this will call Init. 
    /// 
    protected virtual void Refresh() 
    { } 
    } 
    #endregion 

    #region class 
    public class xy : Base 
    { 
    private bool run; 

    public xy() 
    { 
     this.run = false; 
    } 

    public bool isRunning() 
    { 
     return this.run; 
    } 

    public void start() 
    { 
     // Do some stuff 
     this.run = true; 
    } 
    } 
    #endregion 

किसी ने मुझे एक उदाहरण प्रदान कर सकते हैं:

मेरा पुराना वर्ग कुछ इस तरह है?

+1

संभावित डुप्लिकेट [क्या एमईएफ सिंगलटन पैटर्न के लिए कोई मूल्य देता है?] (Http://stackoverflow.com/questions/4484619/does-mef-lend-any-value-to-the-singleton-pattern) – IAbstract

+0

क्षमा करें, प्रश्न से संबंधित नहीं है, लेकिन ऐसा लगता है कि आप अनावश्यक रूप से 'Lazy ' को पुन: कार्यान्वित कर रहे हैं। कोड की बाहरी रेखाएं! – binki

उत्तर

18

हाँ, यह ऐसा करने के लिए संभव है:

सिंगलटन के लिए सबसे अच्छा तरीका है कुछ इस तरह है।

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

आप अपने आयात एक ही उदाहरण से आने के लिए नहीं करना चाहते हैं, तो आप यह निर्दिष्ट करने के लिए, या तो अपने विशेषताओं में इसी तरह की जरूरत है:

[Import(RequiredCreationPolicy = CreationPolicy.NonShared)] 
public MyClass : IMyInterface 

या आप अपनी खुद की CompositionContainer ओवरराइड कर सकते हैं ताकि NonShared उदाहरण बना होगा डिफ़ॉल्ट रूप से।

ध्यान दें कि आप भी स्पष्ट रूप से निर्दिष्ट कर सकते हैं जो आप चाहते एक साझा निर्माण नीति (एकमात्र):

[Import(RequiredCreationPolicy = CreationPolicy.Shared)] 
public MyClass : IMyInterface 
{ 
    public MyClass() { } // you can have a public ctor, no need to implement the singleton pattern 
} 

लेकिन यह आवश्यक के रूप में साझा (सिंगलटन) पहले से ही डिफ़ॉल्ट मान है नहीं है।

यहां एमईएफ के दस्तावेज़ीकरण का एक लिंक है: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime जो बताता है कि मैंने अभी क्या बात की है। आप इस विषय पर ब्लॉग ढूंढ सकते हैं: "एमईएफ निर्माण नीति"।

+0

धन्यवाद! यह काम करता हैं! – subprime

+0

गिल्स क्रिएशन पॉलिसी के संबंध में व्यवहार करने के तरीके के बारे में बिल्कुल सही है। बस सोचा कि मैं यह इंगित करता हूं कि सिंगलटन पैटर्न के साथ आपको प्राप्त होने वाली एक आवृत्ति-गारंटी को कड़ाई से लागू नहीं किया गया है क्योंकि कोई भी एमईएफ के बाहर एक और उदाहरण नया कर सकता है। – MatrixManAtYrService

+0

@MatrixManAtYrService अच्छा बिंदु! – Gilles

1

बहुत बुरा अभ्यास! स्थिर निर्माता का उपयोग करें: निष्पादित होने की गारंटी ठीक एक बार

कृपया ध्यान दें कि प्रत्येक T आपके द्वारा बनाए गए के लिए, CLR नई T के लिए स्थिर डेटा कॉपी कर देंगे।

तो आप एक सिंगलटन प्रति T प्रकार का उपयोग कर रहे हैं जिसका उपयोग आप करते हैं।

public class Logger { 
    public static readonly Logger Instace; 

    static Logger() { 
     Instace = new Logger(); 
    } 
} 
+0

हाय, बहुत क्विकली उत्तर के लिए धन्यवाद लेकिन मैं इसे एमईएफ के साथ कैसे उपयोग कर सकता हूं? – subprime

+0

आप इसे एमईएफ के साथ उपयोग कर सकते हैं। बस एमईएफ सब कुछ आपके जैसा सामान्य रूप से होगा और फिर जब MEF FIRST कक्षा को प्रारंभ करता है तो स्थिर कन्स्ट्रक्टर का आह्वान किया जाता है। –

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

  • कोई संबंधित समस्या नहीं^_^