Plugins 如何使用mvvmcross插件,如文件插件

Plugins 如何使用mvvmcross插件,如文件插件,plugins,mvvmcross,Plugins,Mvvmcross,我正在使用mvvmcross版本6.4.1为IOS、Android和WPF开发一个应用程序。 我已经到处寻找我的插件。似乎没有代码示例。文档中说要在我的核心和ui应用程序项目中安装nuget。我做到了。在使用该插件之前,是否需要进行任何特殊的IOC注册/设置/加载,以及如何使用该插件?它们是被注入到构造函数中,还是我必须手动将它们从IOC容器或new()中拉出来 我已经将文件插件的nuget安装到我的WPF UI和核心项目中。我将IMvxFileStore添加到我的一个核心项目的服务构造函数中,

我正在使用mvvmcross版本6.4.1为IOS、Android和WPF开发一个应用程序。 我已经到处寻找我的插件。似乎没有代码示例。文档中说要在我的核心和ui应用程序项目中安装nuget。我做到了。在使用该插件之前,是否需要进行任何特殊的IOC注册/设置/加载,以及如何使用该插件?它们是被注入到构造函数中,还是我必须手动将它们从IOC容器或new()中拉出来

我已经将文件插件的nuget安装到我的WPF UI和核心项目中。我将IMvxFileStore添加到我的一个核心项目的服务构造函数中,认为它自动添加到DI容器中,但它似乎没有被注入

名称空间My.Core.Project.Services
{
公共类SomeService:ISomeService
{
私有IMvxFileStore mvxFileStore;
公共SomeService(IMvxFileStore mvxFileStore)
{
this.mvxFileStore=mvxFileStore;
}
公共字符串SomeMethod(字符串somePath)
{
TryReadTextFile(somePath,输出字符串内容);
返回内容;
}
}
}
App.xaml.cs

使用MvvmCross.Core;
使用MvvmCross.Platforms.Wpf.Views;
...
公共部分类应用程序:MvxApplicatin
{
受保护的覆盖无效注册表设置()
{
this.RegisterSetupType();
}
}
App.cs

使用MvvmCross;
使用MvvmCross.ViewModels;
使用My.Core.Project.Services;
公共类应用程序:MvxApplication
{
公共覆盖无效初始化()
{
Mvx.IocProvider.RegisterType();
RegisterCustomAppStart();
}
}
AppStart.cs

使用MvvmCross.Exceptions;
使用MvvmCross.Navigation;
使用MvvmCross.ViewModels;
使用My.Core.Project.ViewModels;
使用制度;
使用System.Threading.Tasks;
....
公共类AppStart:MvxAppStart
{
公共应用程序启动(IMvxApplication application,IMvxNavigationService navigationService):基础(应用程序,navigationService)
{}
公共覆盖任务NavigateToFirstViewModel(对象提示=null)
{
试一试{
返回NavigationService.Navigate();
}抓住{
抛出e.MvxWrap(“某些错误消息{0}”,typeof(FirstPageViewModel).Name);
}
}
}
WPF项目中的Setup.cs

使用MvvmCross;
使用MvvmCross.Base;
使用MvvmCross.Platforms.Wpf.Core;
使用MvvmCross.Plugin.File;
使用MvvmCross.Plugin.Json;
使用MvvmCross.ViewModels;
使用My.Wpf.Project.Services;
...
公共类设置:MvxWpfSetup
{
公共设置():基(){}
受保护的覆盖IMvxApplication CreateApp()
{
返回新的Core.App();
}
受保护的重写void InitializeFirstChange()
{
base.InitializeFirstChange();
Mvx.IocProvider.RegisterType(()=>newsomewpfspecificservice());
}
受保护的覆盖无效初始值ElastChange()
{
base.InitializeLastChange();
}
}
我希望加载我的服务,但却收到了错误消息 MvxIoCResolveException:未能解析IMvxJsonConverter类型的参数mvxJsonConverter的参数

注意:对于文件和Json插件,我都会收到相同的错误消息,在构造函数中首先列出的插件在应用程序尝试加载时会收到错误消息

我是否正确使用或加载插件

更新:我在UI Setup.cs中手动注册了插件,它正在工作,但我不确定这是否是正确的方法

WPF UI project Setup.cs

使用MvvmCross;
使用MvvmCross.Base;
使用MvvmCross.Platforms.Wpf.Core;
使用MvvmCross.Plugin.File;
使用MvvmCross.Plugin.Json;
使用MvvmCross.ViewModels;
使用My.Wpf.Project.Services;
...
公共类设置:MvxWpfSetup
{
公共设置():基(){}
受保护的覆盖IMvxApplication CreateApp()
{
返回新的Core.App();
}
受保护的重写void InitializeFirstChange()
{
base.InitializeFirstChange();
Mvx.IocProvider.RegisterType(()=>newsomewpfspecificservice());
Mvx.IoCProvider.RegisterType();
Mvx.IoCProvider.RegisterType();
}
受保护的覆盖无效初始值ElastChange()
{
base.InitializeLastChange();
}
}

是的,您正确地使用了插件,我认为现在您手动注册插件的解决方案是可行的

问题的根源在于
MvxSetup
类。此类包含方法
LoadPlugins
,该方法负责加载UI项目引用的MvvmCross插件。这就是
LoadPlugins
如何确定要加载的插件:

  • 获取已加载到应用程序域的执行上下文中的所有程序集
  • 在这些程序集中查找包含
    MvxPluginAttribute
    的类型
  • 现在问题出现在步骤1中。在.NET framework项目中,默认情况下,在代码中实际使用引用的程序集之前,不会将其加载到执行上下文中。因此,如果您没有在UI项目中使用MvvmCross.Plugin.File引用中的某些内容,它将不会加载到您的执行上下文中,也不会在步骤1中找到,因此它不会被
    LoadPlugins
    注册。(读得好:)

    我测试这一点的一种方法是:

    protected override void InitializeFirstChance()
    {
        // Because a type of the MvvmCross.Plugin.File.Platforms.Wpf reference is
        // used here the assembly will now get loaded in the execution context
        var throwaway = typeof(Plugin);
    
        base.InitializeFirstChance();
    }
    
    使用上述代码,您不必手动注册
    插件

    在MvvmCross框架中有一个解决方案,但这是后来的,因为它在其他平台上造成了问题

    在其他平台中,插件程序集将被加载到执行上下文中,而不需要任何技巧,因此我想说,更新MvvmCross文档,声明您必须手动为WPF注册插件,这对将来的其他开发人员非常有用。

    是的,您正在使用该插件