2011-09-04 12 views
10

मैं अपने वर्तमान विंडोज फोन प्रोजेक्ट में स्टर्लिंग डीबी का उपयोग कर रहा हूं, और मैं एमवीवीएम लाइट v4 में नए SimpleIoC कंटेनर का उपयोग करके अपने एप्लिकेशन में विभिन्न स्थानों से स्टर्लिंग डेटाबेस को हल करने में सक्षम होना चाहता हूं।क्या एमवीवीएम लाइट SimpleIoC सिंगलेट्स का समर्थन करता है?

हालांकि, मुझे यकीन नहीं है कि SimpleIoC सिंगलटन पंजीकृत करने का समर्थन करता है या नहीं। स्टर्लिंग डीबी इंजन केवल ऐप लॉन्च होने पर ही बनाया जाना चाहिए, और जब भी कंटेनर इसका संदर्भ इंजेक्ट करता है तो मैं नए उदाहरणों को कताई नहीं करना चाहता हूं।

यदि कोई समस्या है तो मुझे इस समस्या के बारे में सोचना चाहिए, मुझे विकल्पों का मनोरंजन करने में खुशी होगी।

उत्तर

27

SimpleIoc आपके द्वारा पास की जाने वाली कुंजी के आधार पर उदाहरण देता है। यदि आप बिना किसी कुंजी के GetInstance() को कॉल करते हैं, तो आपको हमेशा अपनी ऑब्जेक्ट का डिफ़ॉल्ट उदाहरण मिल जाएगा। उदाहरण केवल तब बनाया जाता है जब आप पहली बार GetInstance को कॉल करते हैं (आलसी सृजन)। यदि आप एक कुंजी के साथ GetInstance को कॉल करते हैं, तो मैं देखता हूं कि रजिस्ट्री में यह नामित उदाहरण पहले से मौजूद है या नहीं। यदि यह अभी तक नहीं है, तो मैं इसे बना देता हूं और फिर मैं इसे वापस कर देता हूं। अगर पहले से ही उस कुंजी के साथ एक उदाहरण है, तो मैं इसे वापस कर देता हूं।

अल्फा संस्करण (बीएल 16 मिक्स संस्करण) में, एक बग है जिसके कारण एक कुंजी का उपयोग किया जाने पर, उदाहरण को बहुत जल्दी बनाने के लिए रजिस्टर का कारण बनता है। यह बग V4 beta1 में ठीक है जो मैं इस सप्ताह प्रकाशित करूंगा।

तो जैसा कि आप देखते हैं कि आपको सरल आइकन से एक ही उदाहरण मिल जाएगा यदि आप हमेशा एक ही कुंजी का उपयोग करते हैं (या यदि आप कुंजी का उपयोग नहीं करते हैं तो बस डिफ़ॉल्ट उदाहरण)।

क्या यह समझ में आता है? लॉरेंट

+0

उम्मीद कर रहा था कि आप इसका उत्तर देने जा रहे हैं ... ;-)। मैंने अनुमान लगाया कि यह इस तरह से काम करता था लेकिन 'हम इसे जवाब देने के दौर में नहीं मिला। – AxelEckenberger

+0

धन्यवाद, लॉरेन। यह काफी काम की बात है। मैं सिर्फ कोड को देखने से इन सवालों के जवाब देने में सक्षम होने के करीब आ रहा हूं, लेकिन मैं अभी तक काफी कुछ नहीं हूं। हमेशा की तरह सहायता की सराहना करते हैं। –

1

मैं अपने सामान्य Silverlight परियोजना में स्टर्लिंग उपयोग कर रहा हूँ और सभी मैं कर रहा हूँ App.xaml को यह जोड़ रहा है ..

<Application.ApplicationLifetimeObjects> 
     <common:SterlingService /> 
     <appServices:WebContext> 
      <appServices:WebContext.Authentication> 
       <!--<appsvc:FormsAuthentication/>--> 
       <appsvc:WindowsAuthentication /> 
      </appServices:WebContext.Authentication> 
     </appServices:WebContext> 
    </Application.ApplicationLifetimeObjects> 

आम संदर्भ SterlingService.cs ठीक मैं उदाहरण से नकल .. की तरह शुरू होता है इस

namespace Common 
{ 
     public sealed class SterlingService : IApplicationService, IApplicationLifetimeAware, IDisposable 
     { 
      public const long KILOBYTE = 1024; 
      public const long MEGABYTE = 1024 * KILOBYTE; 
      public const long QUOTA = 100 * MEGABYTE; 

      private SterlingEngine _engine; 
      private static readonly ISterlingDriver _driver = new IsolatedStorageDriver(); // could use this: new MemoryDriver(); 

      public static SterlingService Current { get; private set; } 

} 

बाद में मैं सिर्फ सू की तरह इस सेवा के चारों ओर एक आवरण बनाया .. और मैं सिर्फ SterlingService जहां कभी मैं इतना की तरह सेवा को संदर्भित करने की जरूरत है कहते हैं ... आशा है इस मदद करता है।

[ExportService(ServiceType.Runtime, typeof(IOffLineDataService))] 
    public sealed class OfflineDataService : IOffLineDataService 
    { 
     User user = WebContext.Current.User; 

     public OfflineDataService() 
     { 

     } 


     public void PurgeAll(Action<Exception> callback) 
     { 
      try 
      { 
       SterlingService.Current.Database.Purge(); 
       callback(null); 
      } 
      catch (Exception ex) 
      { 
       Error.LogError(ex, user); 
       callback(new Exception(ErrorMessages.OfflinePurgeAll)); 
      } 
     } 
} 
संबंधित मुद्दे