MvvmCross: обычный обход плагинов

Я получаю эту ошибку при использовании AddConventionalPlugin:

Вы должны передать тип экземпляра плагина - как

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

потому что мой плагин что-то вроде:

Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin

Я думаю, что Wp7 и Wp8 будут разделены на 2 проекта, потому что они будут использовать другой SDK.

Есть ли способ обойти эту проблему?

Заранее спасибо за помощь.

1 ответ

Решение

Часть "соглашение" - это просто соглашение об именах.

то есть он просто ищет что-то, что обеспечит 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
    {
    }
}
Другие вопросы по тегам