更新到MvvmCross 4.1.4后,MvxLoaderPluginRegistry.AddConventionalPlugin丢失

时间:2016-04-22 10:55:36

标签: plugins xamarin mvvmcross

更新为MvvmCross MvxLoaderPluginRegistry.AddConventionalPlugin后,

4.1.4缺失。现在我可以看到一组或Register方法具有不同的签名:

https://github.com/MvvmCross/MvvmCross/blob/a45cb515844f935b8b8ca04cf905342665a53fb9/MvvmCross/Platform/Platform/Plugins/MvxLoaderPluginRegistry.cs

如何在更新后加载插件?

2 个答案:

答案 0 :(得分:3)

插件通过Bootstrappers加载。这些引导程序会自动安装文件夹Bootstrap中的MvvmCross插件。当您通过NuGet安装插件时,$rootnamespace将替换为目标项目的根命名空间。

iOS Bootstrapper

继承自MvxLoaderPluginBootstrapAction

namespace $rootnamespace$.Bootstrap
{
    public class BlePluginBootstrap
        : MvxLoaderPluginBootstrapAction<MvvmCross.Plugins.BLE.PluginLoader, MvvmCross.Plugins.BLE.iOS.Plugin>
    {
    }
}

Android Bootstrapper

继承自MvxPluginBootstrapAction

namespace $rootnamespace$.Bootstrap
{
    public class BlePluginBootstrap
        : MvxPluginBootstrapAction<MvvmCross.Plugins.BLE.PluginLoader>
    {
    }
}

bootstrappers of installed plugins

<强>插件加载

public class PluginLoader
  : IMvxPluginLoader
{
    public static readonly PluginLoader Instance = new PluginLoader();

    public void EnsureLoaded()
    {
        var manager = Mvx.Resolve<IMvxPluginManager>();
        manager.EnsurePlatformAdaptionLoaded<PluginLoader>();
    }
}

插件

每个插件都有其特定于平台的Plugin类,用于注册接口的实现。

namespace MvvmCross.Plugins.BLE.Droid
{
    public class Plugin
     : IMvxPlugin
    {
        public void Load()
        {
            Mvx.LazyConstructAndRegisterSingleton<IAdapter>(() => new Adapter());
        }
    }
}

答案 1 :(得分:3)

确实如此。 MvxLoaderPluginRegistry在MvvmCross 4.1.4中没有这样的方法。

建议使用Bootstrap类加载插件。您可以查看MvvmCross example,了解如何加载常规和非常规方法。

注意:您现在可以对所有平台使用MvxLoaderPluginBootstrapAction(4.1.4之前此引导程序仅适用于iOS / Mac平台)

但是,如果您仍想使用Registry加载插件,则必须使用新方法指定特定于平台的类:

public override AddPluginsLoaders (MvxLoaderPluginRegistry registry)
{
    // Register plugin using types
    registry.Register<MyPlugin.PluginLoader, MyPlugin.iOS.Plugin>();

    // Registeer plugin using factory method
    registry.Register<MyPlugin.PluginLoader>(() => new MyPlugin.iOS.Plugin());
}

// Don't forget to load these plugins
public override void LoadPlugins(IMvxPluginManager pluginManager)
{
    pluginManager.EnsurePluginLoaded<MyPlugin.PluginLoader>();
    base.LoadPlugins(pluginManager);
}