MvvmCross vnext:合并与MonoDroid的插件(MvvmCross vnext: m

2019-09-24 05:52发布

我想要的插件库项目合并成一个单一的一个(例如,地点+ PhoneCallTask​​)。 它的工作原理完全与WP7,但我得到MonoDroid的未处理的异常:

无法加载文件或程序集“Cirrious.MvvmCross.Plugins.Location.Droid.dll”

当然,位置插件在“Cirrious.MvvmCross.Plugins.Droid.dll”,合并后的库引用。

有没有办法指向合并后的库路径?

Answer 1:

在考虑你的问题更充分地...

我还不能完全确定合并插件是什么,但我认为你所看到的问题必须下到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<Cirrious.MvvmCross.Plugins.Visibility.Droid.Plugin>();
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Location.Droid.Plugin>();
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Phone.Droid.Plugin>();
        loaders.AddConventionalPlugin<AlphaPage.MvvmCross.Plugins.Mega.Droid.Plugin>();
        // etc
    }


Answer 2:

简短的回答:

我猜你需要:

  • 检查您的命名空间和程序集名称都是一样的公约
  • 检查你所引用的两个核心插件组件和UI.Droid项目中正确的插件实现

更长的答案(基于一些笔记我已经有了 - 即将出版):

如果你要建立一个全新的插件,那么你会:

1.创建中央共享插件

这将是便携式类库-说AlphaPage.MvvmCross.Plugins.Mega

内的中央共享PCL,你会把任何可移植的代码是可利用的 - 通常这可能只是几个服务接口定义 - 例如:

public interface IAlphaService { ... }

public interface IPageService { ... }

然后你会添加插件管理该插件,它想补充的样板:

public class PluginLoader
    : IMvxPluginLoader
    , IMvxServiceConsumer<IMvxPluginManager>
{
    public static readonly PluginLoader Instance = new PluginLoader();

    #region Implementation of IMvxPluginLoader

    public void EnsureLoaded()
    {
        var manager = this.GetService<IMvxPluginManager>();
        manager.EnsureLoaded<PluginLoader>();
    }

    #endregion
}

2.创建特定的插件实现

对于每一个平台,那么您需要执行该插件-例如,你可能会实现AlphaPage.MvvmCross.Plugins.Mega.WindowsPhoneAlphaPage.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<IAlphaService>(new MyAlphaService());
        // page registered as a type
        this.RegisterServiceType<IPageService, MyPageService>();
    }

    #endregion
}

3.插件的实例化

每个UI客户必须初始化插件。

这是由最终用户界面的客户端添加的库引用完成:

  • 共享芯插件
  • 相应的插件实现

3.1 WinRT的,WindowsPhone的和MonoTouch的

然后,WinRT中,WindowsPhone的和MonoTouch的客户端,还需要在setup.cs提供装载机访问-这样的:

    protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
    {
        loaders.AddConventionalPlugin<AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone.Plugin>();
        base.AddPluginsLoaders(loaders);
    }

需要注意的是公约用在这里 - 所以,重要的是AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone.Plugin实现了AlphaPage.MvvmCross.Plugins.Mega.PluginLoader的WindowsPhone的插件

3.2 MonoDroid的

对于MonoDroid的客户端,您不需要添加此设置步骤-因为MonoDroid的比其他平台更小Assembly.Load限制-和AO可以从文件加载的插件。 但是,对于这个工作,很重要的一点,大会名称匹配-如果插件加载器是AlphaPage.MvvmCross.Plugins.Mega.PluginLoader然后约定将尝试从加载插件AlphaPage.MvvmCross.Plugins.Mega.Droid.dll

4.使用的插件服务

这个设置后,那么应用程序应该最终能够通过访问该插件:

  • 添加参考共用芯便携式库
  • 在某些时候调用AlphaPage.MvvmCross.Plugins.Mega.PluginLoader.Instance.EnsureLoaded()
  • 然后访问使用各个服务this.GetService<IAlphaService>()this.GetService<IPageService>()

5.纯便携式插件

有些插件可以是“纯便携”

在这种情况下,他们不需要任何专门为每个平台,并没有第3步是必需的。

对于这样的一个例子,看到JSON的实现- https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/Json



文章来源: MvvmCross vnext: merge plugins with monodroid