C# MVVMLight和特定于平台的服务实现 我所拥有的
使用MVVMLight,我有一些服务接口,它们在一个可移植项目中声明,在一个Windows Phone项目(WP8.1 SL)中有相应的实现。要注册实现,我在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,
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))]