MvvmCross:传统的插件旁路

时间:2012-10-11 15:06:04

标签: c# windows-phone-7 xamarin.ios xamarin.android mvvmcross

使用AddConventionalPlugin时出现此错误:

您必须传入插件实例的类型 - 例如

typeof(Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin)

因为我的插件是这样的:

Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin

我认为Wp7和Wp8将在2个项目中分割,因为它们将使用不同的SDK。

有没有办法绕过这个问题?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

'约定'部分只是命名约定。

即。它只是在寻找能够提供IMvxPlugin的东西:

 Cirrious.MvvmCross.Plugins.Visibility

使用规则'添加'WindowsPhone“'获取:

 Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin

如果规则更改为WP8 ...那么我们只需更改https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.WindowsPhone/Platform/MvxBaseWindowsPhoneSetup.cs

中的约定

虽然WP8仍然有点不清楚......您可以使用以下代码在您的Setup.cs项目中自己完成:

    protected override IMvxPluginManager CreatePluginManager()
    {
        var toReturn = new MvxLoaderBasedPluginManager();
        var registry = new MvxLoaderPluginRegistry(".WP7",toReturn.Loaders);
        AddPluginsLoaders(registry);
        return toReturn;
    }

或者你甚至可以混合和匹配版本 - 即你可以做类似的事情:

    protected override IMvxPluginManager CreatePluginManager()
    {
        var toReturn = new MvxLoaderBasedPluginManager();

        var sharedRegistry = new MvxLoaderPluginRegistry(".WindowsPhone",toReturn.Loaders);
        sharedRegistry.AddConventionBasedPlugin<SharedP1>();
        sharedRegistry.AddConventionBasedPlugin<SharedP1>();
        sharedRegistry.AddConventionBasedPlugin<SharedP3>();

        var wp7Registry = new MvxLoaderPluginRegistry(".WP7",toReturn.Loaders);
        wp7Registry.AddConventionBasedPlugin<WP7P1>();
        wp7Registry.AddConventionBasedPlugin<WP7P2>();

        return toReturn;
    }

最后,没有什么可以强迫你使用约定 - 你总是可以提供自己的插件加载方法,提供Func<IMvxPlugin> - 例如。

    protected override IMvxPluginManager CreatePluginManager()
    {
        var toReturn = new MvxLoaderBasedPluginManager();

        toReturn.Loaders.Add('Cirrious.MvvmCross.Plugins.Visibility.WindowsPhone.Plugin', () =>
               {
                  // do whatever code you want to do...
                  return thePlugin; 
               });

        return toReturn;
    }

您可以混合搭配这些技巧


或者,如果您愿意,可以提供全新的IMvxPluginManager实现。界面只是:

public interface IMvxPluginManager
{
    bool IsPluginLoaded<T>() where T : IMvxPluginLoader;
    void EnsureLoaded<T>() where T : IMvxPluginLoader;
}

所以,你可以提供一个非常简单的经理,如

public class SimplePluginManager : IMvxPluginManager
{
    public SimplePluginManager()
    {
        // load the plugins your app needs here!
        Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin.Load();
        Cirrious.MvvmCross.Plugins.Color.WindowsPhone.Plugin.Load();
    }

    public bool IsPluginLoaded<T>() where T : IMvxPluginLoader
    {
        return true;
    }

    public void EnsureLoaded<T>() where T : IMvxPluginLoader
    {
    }
}