2

使用时出现此错误AddConventionalPlugin

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

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

因为我的插件是这样的:

Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin

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

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

在此先感谢您的帮助。

4

1 回答 1

2

“约定”部分只是命名约定。

即它只是在寻找可以提供 IMvxPlugin 的东西:

 Cirrious.MvvmCross.Plugins.Visibility

使用规则 'add "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
    {
    }
}
于 2012-10-11T15:53:24.283 回答