C# MVVMLight和特定于平台的服务实现 我所拥有的

C# MVVMLight和特定于平台的服务实现 我所拥有的,c#,mvvm-light,C#,Mvvm Light,使用MVVMLight,我有一些服务接口,它们在一个可移植项目中声明,在一个Windows Phone项目(WP8.1 SL)中有相应的实现。要注册实现,我在App类中的Application\u Launching方法中使用SimpleIoc.Default.register public partial class App : Application { ... private async void Application_Launching(object sender,

使用MVVMLight,我有一些服务接口,它们在一个可移植项目中声明,在一个Windows Phone项目(WP8.1 SL)中有相应的实现。要注册实现,我在
App
类中的
Application\u Launching
方法中使用
SimpleIoc.Default.register

public partial class App : Application
{
    ... 

    private async void Application_Launching(object sender, LaunchingEventArgs e)
    {
        ...

        // add some platform specific services to the IOC container
        SimpleIoc.Default.Register<INavigationService, NavigationServiceWP>(true);
        SimpleIoc.Default.Register<ISettingsService, SettingsService>(true);
        SimpleIoc.Default.Register<IThemeService, ThemeService>(true);
        SimpleIoc.Default.Register<IGeofenceService, GeofenceService>(true);
        SimpleIoc.Default.Register<IVersionService, TrialInformation>(true);
        SimpleIoc.Default.Register<IPhoneService, PhoneServices>(true);

        ...
    }

    ...
}
此消息接收器已在构造函数中注册

// TagColorViewModel
[PreferredConstructor]
public TagColorViewModel(INavigationService navigationService)
{
    ...

    // Messages
    MessengerInstance.Register<Tag>(this, MessengerToken.SetTag, SetTag);
}
不幸的是,这不起作用。原因是,从上面的构造函数中可以看出,
TagColorViewModel
依赖于
INavigationService
。然后,在调用视图模型定位器的静态构造函数之后,在
应用程序启动
方法中注册。结果是SimpleIoc无法创建
TagColorViewModel
的实例,因为没有已知的
INavigationService
接口或实现

实际问题 我如何解决这个问题?换句话说:如何在MVVMLights SimpleIoc中注册特定于平台的服务,以便让它在注册期间创建视图模型的实例

Xamarin似乎使用装饰器来解决这些问题,但我不知道MVVMLight中有任何类似的构造

Xamarin.Forms.Dependency(typeof(PopupService))
当前解决方法 我目前的解决方法是在注册所有特定于平台的服务之后立即获取一个永远不会使用的实例。这是可行的,但我认为这不是正确的解决方案

private async void Application_Launching(object sender, LaunchingEventArgs e)
{
    ...

    // add some platform specific services to the IOC container
    SimpleIoc.Default.Register<INavigationService, NavigationServiceWP>(true);
    ...

    var tcvm = SimpleIoc.Default.GetInstance<TagColorViewModel>();

    ...
}
private async void应用程序\u启动(对象发送方,启动事件参数e)
{
...
//向IOC容器中添加一些特定于平台的服务
SimpleIoc.Default.Register(true);
...
var tcvm=SimpleIoc.Default.GetInstance();
...
}

一种方法可能是在应用程序构建期间执行特定于平台的服务注册,而不是在应用程序启动时执行。这将确保您的所有服务尽早注册。唯一需要注意的是确保它们发生在调用
ServiceLocator.SetLocatorProvider

后,使用Xamarin的依赖项服务和MVVMLight的组合。MVVMLight的Register方法有一个重载,您可以在其中编写自己的函数来生成实例

将所有服务注册放回ViewModelLocator,如下所示:

SimpleIoc.Default.Register<Service.INavigationService>(() => {
     return DependencyService.Get<Service.INavigationService>();
});
Xamarin.Forms.Dependency(typeof(PopupService))
private async void Application_Launching(object sender, LaunchingEventArgs e)
{
    ...

    // add some platform specific services to the IOC container
    SimpleIoc.Default.Register<INavigationService, NavigationServiceWP>(true);
    ...

    var tcvm = SimpleIoc.Default.GetInstance<TagColorViewModel>();

    ...
}
SimpleIoc.Default.Register<Service.INavigationService>(() => {
     return DependencyService.Get<Service.INavigationService>();
});
[assembly: Xamarin.Forms.Dependency(typeof(NavigationService))]