4

我正在试一试 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 服务?

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

托比

4

1 回答 1

9

有三个基本选项:

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


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

于 2013-01-15T13:01:09.997 回答