MvvmCross vnext:将插件与monodroid合并
我正在尝试将插件库项目合并为一个(例如,Location + PhoneCallTask)。 它与wp7完美配合,但我得到monodroid的未处理exception:
无法加载文件或程序集’Cirrious.MvvmCross.Plugins.Location.Droid.dll’
当然,位置插件在’Cirrious.MvvmCross.Plugins.Droid.dll’(合并库)中引用。
有没有办法指向合并的库路径?
更全面地考虑了你的问题……
我仍然不完全确定合并插件是什么,但我认为你看到的问题必须归结为MvvmCross-MonoDroid使用文件约定加载插件的方式,而所有其他平台强制用户提供显式工厂方法对于每个插件。
造成这种差异的原因是因为文件约定是(IMO)最好的方式……但是所有其他平台都将安全性和/或编译问题放在了必须使用替代机制的方式……
您最容易做的事情可能是切换MonoDroid应用程序的设置以使用加载程序约定。
去做这个:
-
在Setup.cs中将
CreatePluginManager()
重写为:protected override IMvxPluginManager CreatePluginManager() { var toReturn = new MvxLoaderBasedPluginManager(); var registry = new MvxLoaderPluginRegistry(".Droid", toReturn.Loaders); AddPluginsLoaders(registry); return toReturn; }
然后提供AddPluginsLoaders()
实现,如:
protected virtual void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders) { loaders.AddConventionalPlugin(); loaders.AddConventionalPlugin(); loaders.AddConventionalPlugin(); loaders.AddConventionalPlugin(); // etc }
简短回答:
我猜你需要:
- 检查您的命名空间和程序集名称是否都是相同的约定
- 检查您是否在UI.Droid项目中引用了核心插件程序集和正确的插件实现
更长的答案(基于我已经拥有的一些笔记 – 将很快发布):
如果你要构建一个全新的插件,那么你会:
1.创建一个中央共享插件
这将是可移植类库 – 比如AlphaPage.MvvmCross.Plugins.Mega
在该中央共享PCL中,您可以放置任何可用的可移植代码 – 通常这可能只是一些服务接口定义 – 例如
public interface IAlphaService { ... }
和
public interface IPageService { ... }
然后,您将为该插件添加PluginManager,它只会添加以下的样板:
public class PluginLoader : IMvxPluginLoader , IMvxServiceConsumer { public static readonly PluginLoader Instance = new PluginLoader(); #region Implementation of IMvxPluginLoader public void EnsureLoaded() { var manager = this.GetService (); manager.EnsureLoaded(); } #endregion }
2.创建特定的插件实现
对于每个平台,您将实现该插件 – 例如,您可以实现AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone
和AlphaPage.MvvmCross.Plugins.Mega.Droid
在每个中,您将实现提供服务的本机类:
public class MyAlphaService : IAlphaService { ... }
和
public class MyPageService : IPageService { ... }
最后,每个插件都会提供样板插件实现:
public class Plugin : IMvxPlugin , IMvxServiceProducer { #region Implementation of IMvxPlugin public void Load() { // alpha registered as a singleton this.RegisterServiceInstance(new MyAlphaService()); // page registered as a type this.RegisterServiceType(); } #endregion }
3.插件的实例化
每个UI客户端都必须初始化插件。
这是由最终UI客户端添加库引用完成的:
- 共享核心插件
- 适当的插件实现
3.1 WinRT,WindowsPhone和MonoTouch
然后,对于WinRT,WindowsPhone和MonoTouch客户端,您还需要在setup.cs中提供一个Loader访问器 – 例如:
protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders) { loaders.AddConventionalPlugin(); base.AddPluginsLoaders(loaders); }
请注意,此处使用约定 – 因此AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone.Plugin为AlphaPage.MvvmCross.Plugins.Mega.PluginLoader实现WindowsPhone插件非常重要。
3.2 MonoDroid
对于MonoDroid客户端,您不需要添加此设置步骤 – 因为MonoDroid比其他平台具有更少的Assembly.Load限制 – 并且ao可以从文件加载插件。 但为了实现这一点,重要的是程序集名称匹配 – 如果PluginLoader是AlphaPage.MvvmCross.Plugins.Mega.PluginLoader
那么约定将尝试从AlphaPage.MvvmCross.Plugins.Mega.Droid.dll
加载插件
4.使用插件服务
在此设置之后,应用程序最终应该能够通过以下方式访问插件:
- 添加共享核心可移植库的引用
- 在某些时候调用
AlphaPage.MvvmCross.Plugins.Mega.PluginLoader.Instance.EnsureLoaded()
- 然后使用
this.GetService
或() this.GetService
访问各个服务()
5.纯便携式插件
有些插件可以“纯手提”
在这种情况下,他们不需要为每个平台进行任何专业化,也不需要第3步。
有关此示例,请参阅Json实现 – https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/Json