2015-04-18 9 views
5

मैं डब्ल्यूपीएफ में एक कुकबुक विंडो एप्लिकेशन पर काम कर रहा हूं जिसमें एक खिड़की और कई उपयोगकर्ता नियंत्रण शामिल हैं जो एक दूसरे को रिले के साथ बदल रहे हैं। एमवीवीएम लाइट से संदेशों का उपयोग करते हुए कॉमांड।एमवीवीएम लाइट एप्लिकेशन - व्यूमोडल्स को ठीक से कैसे साफ करें

एप्लिकेशन डीआरबी के साथ काम करता है जो इकाई फ्रेम से उत्पन्न होता है। समस्या सभी लेकिन फ़ाइल की पहली निष्पादन के बाद आती है कि इस कार्यक्रम के कई warings और इसी प्रकार के त्रुटियों से पता चलता है:

public ViewModelLocator() 
     { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

      SimpleIoc.Default.Register<MainWindowViewModel>(); 
      SimpleIoc.Default.Register<MainViewModel>(); 
      SimpleIoc.Default.Register<FoodTypeViewModel>(); 
      SimpleIoc.Default.Register<ShoppingCartViewModel>(); 
      SimpleIoc.Default.Register<MenuViewModel>(); 
      SimpleIoc.Default.Register<MenuListViewModel>(); 
      SimpleIoc.Default.Register<MenuCalendarViewModel>(); 
      SimpleIoc.Default.Register<ChooseFoodWindowViewModel>(); 
} 

और यह भी:

Warning 1 Could not copy "...\cookbook\Cookbook.Services\Database1.mdf" to "bin\Debug\Database1.mdf". Beginning retry 1 in 1000ms. The process cannot access the file '...\cookbook\Cookbook.Services\Database1.mdf' because it is being used by another process. Cookbook.Services 

ViewModelLocator में मैं इस राशि उन्हें रों बनाने के लिए सिंगलटन बनाने के लिए

BackToMainCommand = new RelayCommand(() => 
    { 
     Messenger.Default.Send<ViewModelBase>(new MainViewModel()); 
    }, 
    () => true); 

मैं ViewModels के साथ toyed है: संदेशों मैं userControls स्विच करने के लिए उपयोग कर रहा हूँ जैसे ViewModels के नए उदाहरणों, पैदा कर रहे ure प्रणाली में केवल एक प्रतियां हैं, लेकिन SimpleIoc को पंजीकरण के लिए सार्वजनिक रचनाकारों की आवश्यकता है। और मुझे यह भी नहीं पता कि क्या इससे मेरी समस्या भी मदद मिलेगी। इसके अलावा मैंने आपको यह नहीं बताया कि ViewModelLocator का उपयोग केवल xaml में किया जाता है, इसलिए मेरे पास सामान को साफ करने का भी उदाहरण नहीं है। (मैं शायद इसे गलत इस्तेमाल कर रहा हूं लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाना चाहिए)

समस्या यह है कि मुझे नहीं पता कि सभी दृश्य मॉडल को कैसे और कहाँ साफ करना है क्योंकि वे कई स्थानों पर बनाए जा रहे हैं। मैंने उल्लेख किया है और उनमें से कुछ शायद * .mdf फ़ाइल धारण कर रहे हैं।

+0

है कि आप चल रहे थे आवेदन/डिबगिंग (1) के लिए बनाई गई प्रक्रिया अभी तक पूरा नहीं किया है, या (2) डेटाबेस फ़ाइल के लिए सभी कनेक्शनों को बंद नहीं। तो यदि आप इसे फिर से बनाते हैं, तो इसकी फ़ाइल हैंडल अभी भी खुली है और आप खुली फ़ाइल पर प्रतिलिपि नहीं बना सकते हैं। ध्यान दें कि जब डिबगिंग करते हैं, खासकर यदि आपने "डिबगिंग रोकें" बटन का उपयोग करके अपना डिबगिंग सत्र बंद कर दिया है, तो डीबग प्रक्रिया सीधे नहीं मारे जाती है। विजुअल स्टूडियो से बाहर निकलना और इसे फिर से शुरू करना आम तौर पर इसे हल करता है। – Alex

+0

ठीक है, वे कनेक्शन कुछ व्यूमोडल्स में हैं जो डीबी से सेवाओं का उपयोग कर रहे हैं। और उन व्यूमोडल्स मुझे लगता है कि लोकेटर या संदेश (यदि मैं गलत नहीं हूं) द्वारा पकड़ रहा है। मुझे पता है कि दृश्य स्टूडियो को पुन: प्रारंभ इससे समस्या का समाधान लेकिन मैं इसे ठीक करने के लिए तो मैं काम कर आवेदन के बाद से यह और भी तब होगा, जब मैं बाहर निकलें बटन या खिड़की से पार के साथ अनुप्रयोग से बाहर हो सकता है की जरूरत है। – Dracke

उत्तर

2

टिप्पणी में उल्लेख किया है, आप

चेतावनी 1 कॉपी नहीं किया जा सका हो रही है "... \ रसोई की किताब \ Cookbook.Services \ Database1.mdf" को "बिन \ डीबग \ Database1.mdf" । 1000ms में 1 पुनः प्रयास करना शुरू करें।

प्रक्रिया '... \ cookbook \ Cookbook.Services \ Database1.mdf' फ़ाइल तक नहीं पहुंच सकती है क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

Cookbook.Services निर्माण में संकलक से (और पर्याप्त पुनर्प्रयास त्रुटि के बाद) चेतावनी संदेश है, क्योंकि है कि आप चल रहे थे/डिबगिंग आवेदन के लिए बनाई गई प्रक्रिया:

  1. अभी तक पूरा नहीं किया है , या
  2. डेटाबेस फ़ाइल के सभी कनेक्शन बंद नहीं किया गया है।

तो जब आप इसे फिर से बनाते हैं, तो इसकी फ़ाइल हैंडल अभी भी खुली है और आप खुली फ़ाइल पर प्रतिलिपि नहीं बना सकते हैं।

यह कोड आप अपने प्रश्न इस का सीधा कारण है कि क्या में पोस्ट किया है से स्थापित करने के लिए कठिन है, लेकिन इस लाइन:

Messenger.Default.Send<ViewModelBase>(new MainViewModel()); 

स्पष्ट रूप से, समस्याग्रस्त है, क्योंकि यह एक नया उदाहरण देता है, बजाय सिंगलटन लाइफसाइकिलSimpleIoC कंटेनर से उदाहरण।हालांकि अभी भी एक उचित डि नजरिए से बदसूरत, आप इसे करने के लिए बदल सकता है:

Messenger.Default.Send<ViewModelBase>(ServiceLocator.Current.GetInstance<MainViewModel>()); 

तो यह आपके MainViewModel का एक नया उदाहरण बनाने नहीं होगा, लेकिन आईओसी कंटेनर से एक वापसी।

इसके अलावा, आप सुनिश्चित करें कि आपके डेटाबेस संदर्भ अपने कंटेनर में पंजीकृत है, और यह जरूरत है कि दृश्य मॉडल में इंजेक्शन बनाने के लिए कर सकते हैं। इस दृष्टांत (, यह मानते हुए अपने डेटाबेस संदर्भ/सेवा वर्ग MyDbContext कहा जाता है को लागू करता है IMyDbContext, और इसके निर्माता तर्क के रूप में एक कनेक्शन स्ट्रिंग लेता है):

SimpleIoc.Default.Register<IMyDbContext>(() => new MyDbContext(GetMyConnectionString())); 

अब, आप यह भी कहा कि यह सुनिश्चित करना चाहिए आवेदन बाहर निकलने पर, उचित सफाई किया जाता है ताकि Dispose अपने आवेदन में किसी भी अन्य संभावित संसाधन है कि निपटान की आवश्यकता होती है IMyDbContext उदाहरण पर कहा जाता है, और।

0

आपकी समस्या शायद जिस तरह से आप अपने DbContext का उपयोग के कारण होता है: अगर यह नहीं पहले से ही MVVM लाइट के माध्यम से, किया जाता है, आपको लगता है कि आपके Application पर Application.Exit Event पर प्रतिक्रिया द्वारा कर सकते हैं। आपने अपने प्रश्न में उपस्थित नहीं किया कि आप कैसे संभालते हैं, इसलिए मैं अनुमान लगाने की कोशिश करूंगा कि आपकी तरफ क्या होता है। आपको हमेशा यह सुनिश्चित करना चाहिए कि डीबीकॉन्टेक्स्ट का उपयोग करने के बाद आप तुरंत इसका निपटान करें। इसे पूरे आवेदन के रहने वाले समय के लिए नहीं रखा जाना चाहिए। मुझे नहीं लगता कि आप इसे अपने आईओसी के साथ पंजीकृत कर रहे हैं, इसलिए मुझे लगता है कि आप इसे अपने व्यू मॉडल्स के भीतर कहीं भी तुरंत चालू कर देते हैं। इस तरह के मामले में आपको हमेशा डीबीकॉन्टेक्स्ट ऑब्जेक्ट्स का उपयोग() को यह सुनिश्चित करने के लिए करना चाहिए कि उनका निपटान किया जाए। यदि आप पूर्ण रूप से अपना आवेदन बंद करते समय निश्चित रूप से पूरा कर लेंगे कि आपके डीबी के लिए निश्चित रूप से कोई कनेक्शन नहीं होना चाहिए।

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

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