Я новичок в 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 или в конструкторе представления?
Буду признателен за вашу помощь