it-swarm.com.ru

ServiceLocationProvider должен быть установлен

Я использую MVVM Light. Когда я добавляю больше преобразователей значений в мои ресурсы, мое приложение аварийно завершает работу:

Исключение типа «System.InvalidOperationException» произошло в Microsoft.Practices.ServiceLocation.DLL, но не было обработано в коде пользователя

Дополнительная информация: ServiceLocationProvider должен быть установлен.

В событии App.xaml.cs OnLaunched у меня есть эта строка

ServiceLocator.Current.GetInstance<MyViewModel>();

Там происходит сбой .. В этом ServiceLocator я вижу, что есть метод SetLocatorProvider, который принимает в качестве аргумента ServiceLocatorProvider. Я не мог найти что-либо на веб-странице Microsoft's и MSDN устарел:

protected override async void OnLaunched(LaunchActivatedEventArgs e)
    {
        Frame rootFrame = Window.Current.Content as Frame;

        if (rootFrame == null)
        {
            ...
        }

        if (rootFrame.Content == null)
        {
            ...
        }

        Window.Current.Activate();

        DispatcherHelper.Initialize();

        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        ServiceLocator.Current.GetInstance<MyViewModel>();
    }

Правка: Вот полное событие OnLaunched . После помещения 

ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

исключение происходит:

Исключение типа Microsoft.Practices.ServiceLocation.ActivationException 'произошло в GalaSoft.MvvmLight.Extras.DLL, но не было обработано в коде пользователя

Дополнительная информация: Тип не найден в кеше: cMC.ViewModel.MyViewModel.

Это код ViewModelLocator

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

        SimpleIoc.Default.Register<MyViewModel>();
    }

    public MyViewModel MyVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MyViewModel>();
        }
    }

    public static void Cleanup() {}
}
8
v.g.

Я вроде понял это.

Также была необходимость зарегистрировать ViewModel, что произошло в конструкторе ViewModelLocator, но по какой-то причине конструктор выполняется позже. Поэтому я изменил класс ViewModelLocator следующим образом:

public class ViewModelLocator
{
    public ViewModelLocator()
    {

    }

    public static void SetAndReg()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        SimpleIoc.Default.Register<MyViewModel>();
    }

    public MyViewModel MyVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MyViewModel>();
        }
    }

    public static void Cleanup() {}
}

}

Затем в App.xaml.cs:

...OnLaunched(...)
{
...
        DispatcherHelper.Initialize();

        ViewModelLocator.SetAndReg();

        ServiceLocator.Current.GetInstance<MyViewModel>();
...
}
5
v.g.

Вы не устанавливаете LocationProvider (хорошо, сообщение об ошибке довольно очевидно ..):

Вам нужно предоставить ServiceLocator ваш контейнер IoC на выбор: Посмотрите на этот пример, который использует Unity и адаптер:

static ViewModelLocator()
    {
        var container = new UnityContainer();
        ServiceLocator.SetLocatorProvider(() => new UnityServiceLocatorAdapter(container));

        container.RegisterInstance<ILoggingService>(new ConsoleLoggingService());
        container.RegisterInstance<IMessageBoxService>(new SimpleMessageBoxService());
        container.RegisterInstance<ITestSuiteService>(new TestSuiteService());
        container.RegisterInstance<IApplicationService>(new ApplicationService());
    }

    /// <summary>
    /// Gets the <see cref="BackstageAboutViewModel"/>.
    /// </summary>
    public BackstageAboutViewModel BackstageAboutViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<BackstageAboutViewModel>();
        }
    }
1
Xeun