使用SimpleIoc mvvmlight

时间:2018-09-25 04:26:43

标签: xamarin.forms mvvm-light

我是Xamarin的新手,具有一定的.NET背景,并且正在创建新的Xamarin.Forms应用程序的构建基块(使用XAML),就像Xamarin的新手一样,我进行了一些研究,发现MVVMLight是其中之一最常用的框架,所以我决定使用它。

关注在线tutorial之后,我陷入了正确的方式来注入视图模型正常工作所需的依赖项(自定义或全局服务)。

提到的教程遵循以下模式:

1)首先,它在共享库(PCL或NetStandard)中创建一个名为“ servicelocator.cs”的全局类,应在其中注册视图模型类和任何其他业务服务,并将视图模型公开为公共属性

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;
        }
    }
}

4)最后,使用先前设置的App.xaml.cs全局属性在AppMainPageView.xaml.cs中将BindingContext设置为视图模型。

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中是如何工作的,但是对我来说,直接使用命名的全局属性而不是使用某种形式的viewmodel设置viewmodel的过程是很奇怪的构造函数注入。

Xamarin.Forms是否有可能直接在XAML或视图的构造函数中解决BindingContext的viewmodel依赖关系?

感谢您的帮助

0 个答案:

没有答案