MVVMCross中特定于平台的IoC

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服务?

谢谢,一般的框架工作很棒,我真的很喜欢它的工作原理(除了这一点,我还不能理解)

托比

Stu*_*art 9

有三种基本选择:

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.对于初始化步骤列表和顺序,请参阅InitializePrimaryInitializeSecondaryMvxBaseSetup.cs

2.在UI代码的其他位置添加特定于平台的注册 - 例如在特定视图的构造函数中(此选项使用不多......但是如果你想...,你可以在一些奇怪的情况下使用它) )

3.使用插件 - 所有插件都是IoC的包装器.插件的缺点是它们会增加一些开发开销(您必须添加单独的项目和插件样板文件),但它们的优点是可以跨应用程序重用它们,并且更容易为它们编写测试应用程序和测试工具.有关插件的更多信息,请参阅为Task/Intent制作单声道跨平台支持,并参阅http://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html


我的一般建议 - 从第一个选项开始,如果要在以后的项目中重用代码,请迁移到插件...

  • @pdusen现在可以正常工作:protected override void InitializeLastChance(){MvxSimpleIoCContainer.Instance.RegisterType <DemoApp.Core.Services.IValueService,DemoApp.Services.ValueService>(); base.InitializeLastChance(); } (2认同)