Tob*_*ans 4 inversion-of-control mvvmcross
我正在给MVVMCross一个旋转,看看它是否会在一些更大的项目中出现,而且它很棒.我喜欢导航,viewModel位置和一般的跨平台方法,这正是我需要的.但是,根据平台的不同,我有点坚持拆分一些依赖注入.
因此,我们有一个基本的应用程序,带有一个共享的可移植库,在启动时初始化服务引用:
public TwitterSearchApp()
{
InitaliseServices();
}
private void InitaliseServices()
{
this.RegisterServiceInstance<ITwitterSearchProvider>(new TwitterSearchProvider());
}
Run Code Online (Sandbox Code Playgroud)
精细.这定义了将在所有平台上使用的服务实现.但是我需要在不同平台上实现不同实现的情况如何 - 例如可能存储/缓存,核心要求相同,但需要在手机上以不同于平板电脑的方式进行处理.
我以为它可能会在某处安装:
public class Setup : MvxBaseWinRTSetup
{
public Setup(Frame rootFrame): base(rootFrame)
{
}
protected override MvxApplication CreateApp()
{
var app = new TwitterSearchApp();//set platorm specific IoC here maybe?
return app;
}
protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
{ // or perhaps here?
loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Visibility.WinRT.Plugin>();
base.AddPluginsLoaders(loaders);
}
}
Run Code Online (Sandbox Code Playgroud)
但我不确定.我已经看到了替换ViewModel定位器的引用,但有没有类似的方法来替换其他IoC服务?
谢谢,一般的框架工作很棒,我真的很喜欢它的工作原理(除了这一点,我还不能理解)
托比
有三种基本选择:
1.在UI项目中添加特定于平台的服务,然后在设置期间将其注册到覆盖中 - 这取决于您何时需要服务,但在大多数情况下,您可以使用在InitializeLastChance初始化结束时调用的覆盖:
protected override void InitializeLastChance()
{
this.RegisterServiceInstance<IMyService>(new SingletonMyService());
this.RegisterServiceType<IMyService2, PerCallService2>();
base.InitialiseLastChance();
}
Run Code Online (Sandbox Code Playgroud)
如果"最后一次机会"对于您的服务来说太晚了 - 如果您在核心应用启动期间需要该服务 - 那么您可以覆盖任何初始化步骤InitializeIoC- 例如InitializeFirstChance.对于初始化步骤列表和顺序,请参阅InitializePrimary并InitializeSecondary在MvxBaseSetup.cs
2.在UI代码的其他位置添加特定于平台的注册 - 例如在特定视图的构造函数中(此选项使用不多......但是如果你想...,你可以在一些奇怪的情况下使用它) )
3.使用插件 - 所有插件都是IoC的包装器.插件的缺点是它们会增加一些开发开销(您必须添加单独的项目和插件样板文件),但它们的优点是可以跨应用程序重用它们,并且更容易为它们编写测试应用程序和测试工具.有关插件的更多信息,请参阅为Task/Intent制作单声道跨平台支持,并参阅http://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html
我的一般建议 - 从第一个选项开始,如果要在以后的项目中重用代码,请迁移到插件...
| 归档时间: |
|
| 查看次数: |
2979 次 |
| 最近记录: |