1

我希望能够加载 Prism 模块(或等效的(Mvx 插件?)),同时将 MvvmCross 用于其他所有内容。我该怎么做?

更长的版本: 我正在寻找一种方法来结合 MvvmCross 的优点(跨平台,具有良好的 ViewModel 导航),为我的 WPF 应用程序添加一些 Prism 的爱。我特别希望支持区域和模块管理。

据我了解,使用自定义 MvxPresenter,我可以完成区域管理支持在 Prism 中为我所做的事情(如果我错了,请纠正我)。但是,我无法理解如何在不使用 Prism Bootstrapper 的情况下允许动态加载模块(其他程序集)。我不想使用它的原因是因为我需要 Mvx 的引导程序(安装程序)来做它的事情 - 启动我的跨平台应用程序。

提前致谢!:-)

4

1 回答 1

2

MvvmCross 不能在所有平台上进行真正的动态加载 - 因为 Xamarin.iOS 平台不允许这样做(并且 Android 平台也使其变得困难 - 例如,请参阅Dynamicly resolve Assemblies without the file name

目前最接近的 MvvmCross 是插件框架,它使用引导文件来确定要加载的模块。

此序列从https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross/Platform/MvxSetup.cs#L132启动

    protected virtual void PerformBootstrapActions()
    {
        var bootstrapRunner = new MvxBootstrapRunner();
        foreach (var assembly in GetBootstrapOwningAssemblies())
        {
            bootstrapRunner.Run(assembly);
        }
    }

MvxBootstrapRunner方法调用的方法使用反射在指定程序集列表中的任何具体类上查找、创建然后调用“运行” IMvxBootstrapAction- 默认情况下只是 UI 程序集。代码是:https ://github.com/MvvmCross/MvvmCross/blob/v3/CrossCore/Cirrious.CrossCore/Platform/MvxBootstrapRunner.cs#L17

目前这MvxBootstrapRunner只是真正用于插件,我怀疑如果你愿意,你可以将你的模块基于这个插件框架。

或者,引导运行程序的设计意图是它可以轻松适应任何启动操作 - 因此您应该能够使用以下模板构建自己的基于引导的类:

   public class ModuleBootstrapAction<TModule>
      : IMvxBootstrapAction
      where TModule : IModule, new()
   {
       public virtual void Run()
       {
           Mvx.CallbackWhenRegistered<IModuleCatalog>(RunAction);
       }

       protected virtual void RunAction()
       {
           var catalog = Mvx.Resolve<IModuleCatalog>();
           catalog.Add(new TModule());
       }
   }

   public class Module1BootstrapAction<Module1> {}

   public class Module2BootstrapAction<Module2> {}

   public class Module3BootstrapAction<Module3> {}

有关 MvvmCross 启动的更多信息,请参阅https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup

有关 MvvmCross 插件的更多信息,请参阅https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins

于 2013-10-15T06:50:56.110 回答