【问题标题】:Platform-specific IoC in MVVMCrossMVVMCross 中特定于平台的 IoC
【发布时间】:2013-01-15 11:49:40
【问题描述】:

我正在试一试 MVVMCross,看看它是否会在一些更大的项目中使用,这很棒。我喜欢导航、viewModel 位置和通用的跨平台方法,这正是我所需要的。但是,我有点坚持根据平台拆分一些依赖注入。

所以,我们有一个基本的应用程序,它带有一个共享的可移植库,它在启动时初始化服务引用:

    public TwitterSearchApp()
    {
        InitaliseServices();
    }

    private void InitaliseServices()
    {
        this.RegisterServiceInstance<ITwitterSearchProvider>(new TwitterSearchProvider());
    }

很好。这定义了将在所有平台上使用的服务实现。但是,如果我需要在不同平台上实现不同的实现,例如存储/缓存,核心要求是相同的,但在手机上的处理方式与平板电脑上的处理方式不同。

我认为它可能会进入安装程序的某个地方:

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

但我不确定。我已经看到了替换 ViewModel 定位器的参考,但是是否有类似的方法可以替换其他 IoC 服务?

谢谢,总体而言,框架做得很好,我真的很喜欢它的工作原理(除了这一点,我还不太理解)

托比

【问题讨论】:

标签: inversion-of-control mvvmcross


【解决方案1】:

共有三个基本选项:

1。在您的 UI 项目中添加特定于平台的服务,然后在设置期间将它们注册到覆盖中 - 您使用的覆盖取决于何时需要您的服务,但在大多数情况下,您可以只使用最后调用的 InitializeLastChance 覆盖初始化:

protected override void InitializeLastChance()
{
    this.RegisterServiceInstance<IMyService>(new SingletonMyService());
    this.RegisterServiceType<IMyService2, PerCallService2>();
    base.InitialiseLastChance();
}

如果“最后机会”对您的服务来说为时已晚 - 如果您在核心应用程序启动期间需要该服务 - 那么您可以覆盖 InitializeIoC 之后的任何初始化步骤 - 例如InitializeFirstChance。初始化步骤的列表和顺序见MvxBaseSetup.cs中的InitializePrimaryInitializeSecondary

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

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


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

【讨论】:

  • 嗨 Stuart - 我尝试过类似的方法,但是 this.RegisterServiceInstance 在我的 Setup 类中似乎不可用,仅在便携式应用程序中可用 - 我可能缺少扩展方法吗?现在正在试验...
  • 会是“使用 Cirrious.MvvmCross.ExtensionMethods;”有机会吗?
  • 它们只是静态方法的包装。抱歉,我是 Resharper 用户,它只会为我找到 using 语句!
  • 对不起 Stuart,我知道这个问题很古老,但我找不到您提到的选项 1 的方法。根据 Visual Studio,Cirrious.MvvmCross.ExtensionMethods 不存在。这样做的方法是否改变了?
  • @pdusen 现在可以正常工作了:protected override void InitializeLastChance() { MvxSimpleIoCContainer.Instance.RegisterType(); base.InitializeLastChance(); }
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多