Правильный способ внедрения зависимостей viewmodel с помощью SimpleIoc mvvmlight - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в Xamarin с некоторым фоном .NET, и я создаю строительные блоки нового приложения Xamarin.Forms (с XAML), так как новичок в Xamarin, я провел некоторые исследования и обнаружил, что MVVMLight является одним изнаиболее часто используемые платформы, поэтому я решил использовать его.

После изучения интерактивного учебного пособия Я застрял в том, как правильно вводить зависимости (пользовательские или глобальные службы), которые являютсятребуется для правильной работы viewmodels.

Упомянутое руководство следует этому шаблону:

1) Сначала он создает глобальный класс с именем "servicelocator.cs" в общей библиотеке (PCL или NetStandard), гдедолжны быть зарегистрированы классы viewmodel и любые дополнительные бизнес-сервисы, также он отображает viewmodel как открытое свойство

using MyApp.Services;
using MyApp.ViewModels;
using GalaSoft.MvvmLight.Ioc;

namespace MyApp.Infraestructure
{
    public class ServiceLocator
    {
        public ServiceLocator()
        {
            //Service that connects with the API
            SimpleIoc.Default.Register<IRestService, RestService>();

            //ViewModels
            SimpleIoc.Default.Register<AppMainPageViewModel>();
        }

        public AppMainPageViewModel AppMainPageViewModel => SimpleIoc.Default.GetInstance<AppMainPageViewModel>();
    }
}

2) В классе App.xaml.cs он создает открытое свойство, открывающее класс ServiceLocator

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp
{
    public partial class App : Application
    {
        private static ServiceLocator _locator;
        public static ServiceLocator Locator => _locator ?? (_locator = new ServiceLocator());

        public App()
        {
            InitializeComponent();
        }

        //...
    }
}

3) В классе viewmodel Устанавливается зависимость для пользовательского сервиса в конструкторе

using MyApp.Services;
using Xamarin.Forms;

namespace MyApp.ViewModels
{
    public class AppMainPageViewModel
    {
        public IRestService RestService { get; set; }

        public AppMainPageViewModel(IRestService restService)
        {
            RestService = restService;
        }
    }
}
* 10.17 * 4) Наконец, в AppMainPageView.xaml.cs задается BindingContext для модели представления с использованием предыдущего свойства глобального свойства App.xaml.cs
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace MyApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class AppMainPageView : ContentPage
    {
        public AppMainPageView()
        {
            InitializeComponent();

            BindingContext = App.Locator.AppMainPageViewModel;
        }
    }
}

Этот последний шаг кажется мне страннымЯ не знаю, как это работает в Xamarin.Forms, но для меня это довольно странный процесс установки модели представления напрямую с использованием именованного глобального свойства вместо использования какого-либо инжектора конструктора.

Невозможно, чтобы Xamarin.Forms разрешает зависимость viewmodel для BindingContext непосредственно в XAML или в конструкторе представления?

Буду признателен за вашу помощь

...