gpt4 book ai didi

c# - Mvvm交叉 : conventional plugin bypass

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:12 25 4
gpt4 key购买 nike

我在使用 AddConventionalPlugin 时遇到此错误:

你必须传入插件实例的类型——比如

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

因为我的插件是这样的:

Cirrious.MvvmCross.Plugins.Visibility.Wp7.Plugin

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

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

预先感谢您的帮助。

最佳答案

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

即它只是在寻找可以提供 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
{
}
}

关于c# - Mvvm交叉 : conventional plugin bypass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com