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
{
}
}