2016-02-15 12 views
7

पृष्ठभूमि

हाय सब तो दर्शकों प्रकार Microsoft.Practices.ServiceLocation.ActivationException के अपवाद हो रही है। मैं आमतौर पर एक एंड्रॉइड डेवलपर हूं, लेकिन अब मैं एक क्रॉस प्लेटफार्म एप्लिकेशन विकसित कर रहा हूं जो डब्ल्यूपीएफ और एंड्रॉइड को लक्षित करता है। ऐसा कहा जा रहा है कि व्यावहारिक रूप से कोई जानकारी नहीं है कि मैं जो चाहता हूं उसे सीधे कैसे करें। इसलिए, मैंने एक 3-भाग वाली ब्लॉग सीरीज़ को समाप्त कर दिया जो कि विंडोज-आधारित क्रॉस प्लेटफ़ॉर्म एमवीवीएम प्रोजेक्ट को विकसित करने के तरीके पर गहराई से चलता है। जब तक मैं पीसीएल को Xamarin.Android के साथ संगत होने के लिए सेट करता हूं, कोई भी कोड जो किसी त्रुटि को फेंक नहीं देता है, एक बार जब मैं एंड्रॉइड पक्ष में जाता हूं तो काम करना चाहिए। ब्लॉग पोस्ट के लिंक यहां दिए गए हैं: Blog 1, Blog 2, Blog 3। फिर, मैं एंड्रॉइड करता हूं, इसलिए मैं एक डब्ल्यूपीएफ एप्लीकेशन के लिए कोडिंग करने के लिए नया हूं।MVVM लाइट - पीसीएल + WPF -

अंक

तो मेरी मुद्दा आज केवल पीसीएल-WPF पक्ष जो ऊपर से जुड़े ब्लॉग पोस्ट से संबंधित है के साथ काम कर रहा है। मैंने पदों में जितनी अच्छी कोशिश की थी, उतनी ही अच्छी कोशिश की। ब्लॉग दो लक्षित प्लेटफार्मों के रूप में विनआरटी और विनफोन का उपयोग करता है, इसलिए मुझे डब्ल्यूपीएफ पर काम करने के लिए चीजों को समझने की कोशिश की गई। मुझे दो चीजों को करना था IsolatedStorage का उपयोग करना और मूल रूप से WPF पक्ष बनाने के लिए WinPhone App.Xaml का उपयोग करें।

मैंने ब्लॉग को अंत तक पूरा कर लिया है और सफलताओं का निर्माण किया है। मैं अपने उदाहरण डीबग लाइनों को भी देख सकता हूं जैसे कि यह तीसरे ब्लॉग पोस्ट के अंत में बात करता है।

ActivationException उपयोगकर्ता कोड से बिना क्रिया

प्रकार 'Microsoft.Practices.ServiceLocation.ActivationException' की एक अपवाद GalaSoft.MvvmLight.Extras में हुई थी: हालांकि, जब मैं इसे चलाने के लिए जाओ, मैं निम्नलिखित मिल .dll लेकिन उपयोगकर्ता कोड

$ अपवाद {Microsoft.Practices.ServiceLocation.ActivationException: कैश में नहीं मिला प्रकार: StackOverF.Services.IStorageService में प्रबंधित नहीं किया गया था। GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService (टाइप टाइप टाइप, स्ट्रिंग कुंजी, बूलियन कैश) में c: \ MvvmLight \ Source \ GalaSoft.MvvmLight \ GalaSoft.MvvmLight.Extras (पीसीएल) \ Ioc \ SimpleIoc.cs: पंक्ति 537 GalaSoft.MvvmLight.Ioc.SimpleIoc.GetService (टाइप सर्विस टाइप टाइप) में सी: \ MvvmLight \ Source \ GalaSoft.MvvmLight \ GalaSoft.MvvmLight.Extras (पीसीएल) \ Ioc \ SimpleIoc.cs: लाइन 78 9 गैलासोफ्ट.एमवीवीएमलाइट पर। ग में Ioc.SimpleIoc.MakeInstanceTClass: \ MvvmLight \ स्रोत \ GalaSoft.MvvmLight \ GalaSoft.MvvmLight.Extras (PCL) \ Ioc \ SimpleIoc.cs: लाइन 729} {System.Exception Microsoft.Practices.ServiceLocation.ActivationException}

क्या कोई ऐसा चीज है जो आप मुझे बता सकते हैं कि शायद ब्लॉग लेखक ने मुझे छोड़ दिया है? पर्याप्त चट्टानों इस पर फेंक दिया जाता है हो सकता है कि अगर "बोल्डर," यह खुला दरार होगा ...

स्पष्टीकरण

वहाँ मूलतः वर्तमान में मेरे दृश्य स्टूडियो समाधान में केवल दो परियोजनाओं कर रहे हैं। एक पोर्टेबल क्लास लाइब्रेरी है। दूसरा डब्ल्यूपीएफ एप्लीकेशन है। बहुत निकट भविष्य में, एक बार जब मैं समीकरण के डब्ल्यूपीएफ पक्ष पर काम कर रहा हूं, तो मैं एंड्रॉइड प्रोजेक्ट में कोड का पुन: उपयोग करने के लिए एक्समेरिन में पीसीएल का उपयोग करूंगा। हालांकि, एंड्रॉइड साइड मेरी समस्या का हिस्सा नहीं है। जब मैं केवल WPF प्रोजेक्ट से निपट रहा हूं तो मुझे उपरोक्त समस्या है।

संहिता (अंतिम फ़र, 18, वर्ष 2016 संपादित)

IMainViewModel।सीएस

using GalaSoft.MvvmLight.Command; 
using StackOverF.Models; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StackOverF.ViewModels { 
    public interface IMainViewModel { 
     ObservableCollection<Workload> Workload { get; } 

     RelayCommand RefreshCommand { get; } 
     RelayCommand AddCommand { get; } 
    } 
} 

MainViewModel.cs

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using StackOverF.Models; 
using StackOverF.Services; 
using System; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 


namespace StackOverF.ViewModels { 
    public class MainViewModel : ViewModelBase,IMainViewModel { 

     private IDataService dataService; 

     public MainViewModel(IDataService dataService) { 
      this.dataService = dataService; 

      RefreshAsync(); 
     } 

     private ObservableCollection<Workload> workload = new ObservableCollection<Workload>(); 
     public ObservableCollection<Workload> Workload { 
      get { 
       return workload; 
      } 
     } 

     #region Commands 

     #region Refresh 
     private RelayCommand refreshCommand; 
     public RelayCommand RefreshCommand { 
      get { 
       return refreshCommand ?? (refreshCommand = new RelayCommand(async() => { await RefreshAsync();})); 
      } 
     } 

     private async Task RefreshAsync() { 
      workload.Clear(); 
      foreach (Workload listing in await dataService.GetWorkloadAsync()) { 
       workload.Add(listing); 
      } 
     } 
     #endregion 

     #region Add 
     private RelayCommand addCommand; 
     public RelayCommand AddCommand { 
      get { 
       return addCommand ?? 
        (addCommand = new RelayCommand(async() => { 
         Workload listing = new Workload() { Id = 3, Serial = "relay12" }; 
         await dataService.AddWorkloadAsync(listing); 
         workload.Add(listing); 
        })); 
      } 
     } 
     #endregion 

     #endregion 
    } 
} 

LocatorService.cs (DeviceLocatorService, WPF परियोजना में स्थित)

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Ioc; 
using Microsoft.Practices.ServiceLocation; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StackOverF.Services { 
    public class DeviceLocatorService { 
     static DeviceLocatorService() { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

      if (ViewModelBase.IsInDesignModeStatic) { 
      } 
      else { 
      } 

      if (!SimpleIoc.Default.IsRegistered<IStorageService>()) 
       SimpleIoc.Default.Register<IStorageService, StorageService>(); 
     } 

     public static void Cleanup() { 
     } 
    } 
} 

LocatorService.cs (LocatorService में स्थित पीसीएल परियोजना)

using Microsoft.Practices.ServiceLocation; 
using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Ioc; 
using StackOverF.ViewModels; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StackOverF.Services { 
    public class LocatorService { 
     static LocatorService() { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 


      // Services 
      if (ViewModelBase.IsInDesignModeStatic) { 
       SimpleIoc.Default.Register<IDataService, Design.DataService>(); 
      } 
      else { 
       SimpleIoc.Default.Register<IDataService, Services.DataService>(); 
      } 

      // View Models 
      SimpleIoc.Default.Register<IMainViewModel, MainViewModel>(); 
     } 

     public IMainViewModel MainViewModel { 
      get { 
       return ServiceLocator.Current.GetInstance<IMainViewModel>(); 
      } 
     } 

     public static void Cleanup() { 
     } 
    } 
} 

return ServiceLocator.Current.GetInstance<IMainViewModel>(); लाइन पर यह त्रुटियां (केवल डिबगिंग केवल)।

App.xaml

<Application x:Class="StackOverF.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      xmlns:services="clr-namespace:StackOverF.Services;assembly=StackOverF.PCL" 
      xmlns:deviceServices="clr-namespace:StackOverF.Services" 
      StartupUri="Views/MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <deviceServices:DeviceLocatorService x:Key="Locator.WPF" d:IsDataSource="True" /> 
      <services:LocatorService x:Key="Locator" d:IsDataSource="True" /> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+0

विंडोज़ के लिए डब्ल्यूपीएफ? मैं वास्तव में समझ नहीं पा रहा हूं कि आप किस प्लेटफॉर्म को लक्षित कर रहे हैं। – sexta13

+0

यह क्रॉस प्लेटफ़ॉर्म है। मैं जिन दो प्लेटफार्मों के लिए विकास कर रहा हूं वह विंडोज़ और एंड्रॉइड के लिए डब्ल्यूपीएफ है ... एंड्रॉइड लॉल। पीसीएल में आपके पास "सार्वभौमिक" कोड है जिसे दो प्लेटफार्मों में साझा किया जा सकता है, जबकि प्लेटफार्म विशिष्ट कोड अपनी परियोजनाओं में है। –

+0

@Steven_BDawg क्या आप अपना डिवाइस लॉकर सेवा दिखा सकते हैं? जैसा कि मैंने आईओसी कंटेनर में आईएसटीओरेज सेवा पंजीकृत नहीं है। – Valentin

उत्तर

1

मेरी समस्या का हल आसान एक से उम्मीद कर सकते हैं के साथ एक समस्या है। WPF अनुप्रयोगों को MVVM टूलकिट/फ्रेमवर्क का उपयोग करने में कोई समस्या नहीं है, लेकिन उन्हें साझा करने में कोई समस्या है। चूंकि WPF का उद्देश्य क्रॉस-प्लेटफ़ॉर्म-अनुकूल भाषा होने का इरादा नहीं था, इसलिए इस तरह के कार्यक्रम के लिए "सही" तरीका इसके लिए काम नहीं करेगा।

समस्या के App.xaml में दोनों LocatorService वर्गों को शामिल करने की कोशिश कर रहा है और तरह WinRT या WinPhone हो सकता है दोनों वर्गों को चलाने के लिए WPF उम्मीद कर आता है। WPF डेटा की आवश्यकता होने पर केवल कक्षा को संदर्भित करता है। ब्लॉग के उदाहरण की तरह, मेरे पास Main.xaml डेटा LocatorService वर्ग से जुड़ा हुआ था। चूंकि WPF एप्लिकेशन केवल उस वर्ग के कोड को चलाता है, यह त्रुटि फेंक देगा।

समाधान WPF प्रोजेक्ट साइड पर LocatorService फ़ाइलों को एक फ़ाइल में गठबंधन करना था। WPF पक्ष पर क्यों आप पूछते हैं? Portable Class Library में केवल सार्वभौमिक कोड, साझा करने योग्य क्रॉस प्लेटफ़ॉर्म होना चाहिए।

0

जैसा कि मैंने पर विचार आईओसी कंटेनर MainWindow को हल करने के लिए और आदेश में यह कंटेनर निराकरण IDataService बनाने की कोशिश कर रहा है। लेकिन IDataService निर्भरता IStorageService है जो आईओसी कंटेनर में पंजीकृत नहीं है।

मेरे दृष्टिकोण में, IStorageService पंजीकृत नहीं है क्योंकि DeviceLocatorService कन्स्ट्रक्टर कभी नहीं कहा जाता है।

मुझे लगता है आप app.xaml

<Application 
    x:Class="SampleApp.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:ignore="http://www.ignore.com" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable="d ignore"  
    xmlns:services="using:SampleApp.Services" 
    xmlns:local="using:SampleApp"> 

    <Application.Resources> 
     <ResourceDictionary> 

      <services:LocatorService x:Key="Locator" d:IsDataSource="True" /> 
      <services:DeviceLocatorService x:Key="Locator.W8" d:IsDataSource="True" /> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+0

जैसा कि आप देखते हैं कि मैंने इसे जोड़ा है, 'DeviceLocatorService'' App.xaml' में है। –

+0

@Steven_BDawg क्या आप App.xaml में एक नेमस्पेस का उपयोग करने का प्रयास कर सकते हैं? – Valentin

+0

मैं एक नामस्थान का उपयोग कर रहा हूँ। –

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