MvvmCross 插件旨在作为 IoC 之上的基于组件的层工作。
通过对命名空间和程序集使用共享模式以及几个帮助类(Plugin 和 PluginLoader),插件提供了一种共享和重用可移植本机代码组件的方法。
iOS(和 Mac)使用稍微不同的插件加载方案的原因是 MonoTouch 的 AoT 编译器不允许动态Assembly.Load
加载。
因此,iOS 必须使用与其他平台不同类型PluginManager
和不同类型的类。在https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#how-plugins-are-loadedBootstrap
的“如何加载插件”中有更多信息
如果您想将Loader
类型插件注册表添加到 Android 和 iOS,那么我认为您可以在自定义PluginManager
类中执行此操作,然后可以在安装期间使用protected override IMvxPluginManager CreatePluginManager()
.
就像是:
public class MyPluginManager : MvxFilePluginManager, IMvxLoaderPluginManager
{
private readonly Dictionary<string, Func<IMvxPlugin>> _finders = new Dictionary<string, Func<IMvxPlugin>>();
public MyPluginManager(string platformDllPostfix, string assemblyExtension = "") : base(platformDllPostfix, assemblyExtension)
{
}
public IDictionary<string, Func<IMvxPlugin>> Finders
{
get { return _finders; }
}
protected override IMvxPlugin FindPlugin(Type toLoad)
{
var pluginName = toLoad.Namespace;
if (string.IsNullOrEmpty(pluginName))
{
throw new MvxException("Invalid plugin type {0}", toLoad);
}
Func<IMvxPlugin> finder;
if (_finders.TryGetValue(pluginName, out finder))
{
return finder();
}
return base.FindPlugin(toLoad);
}
}
在您的设置中使用以下方法初始化:
protected override IMvxPluginManager CreatePluginManager()
{
return new MyPluginManager(".Droid", ".dll");
}
然后,您需要确保您的基于插件使用基于而不是loader
基于的引导类MvxLoaderPluginBootstrapAction
MvxPluginBootstrapAction
作为另一种选择,如果您对单独重用插件不感兴趣-如果您不想发布大量单独的插件程序集-那么您可以将所有接口和实现放入一个程序集中-然后它们可以共享一个Bootstrap
,Plugin
和PluginLoader
它们之间。
作为最后一种选择,对于您的自定义需求,您始终可以考虑使用您自己的自定义引导类 - 该标准将在您的 UI 程序集中Setup
创建并实现任何可构造的类- 因此您可以用一些适合您的应用程序需求的自定义操作替换。Run
IMvxBootstrapAction
SettingsPluginBootstrap
Run
public class SettingsBootstrapAction
: IMvxBootstrapAction
{
public void Run()
{
// my stuff here
}
}