1

I'm having an issue activating the IMvxMessenger using IoC. (Mac, Xamarin Studio, iOS7, Mono 3.2)

I have downloaded NPlus1DaysOfMvvmCross and loaded the N37 Maps project.

Compiled the project and it works fine.

I then added the Cirrious.MvvmCross.Plugins.Messenger.dll to the project and the following code to the app.cs Initialize just below the service IoC call.

CreatableTypes (typeof(IMvxMessenger).Assembly).AsInterfaces ().RegisterAsSingleton ();

I receive and error when compiling that says: Failed to resolve parameter for parameter id of type Guid when creating Cirrious.MvvmCross.Plugins.Messenger.MvxSubscriptionToken

4

3 回答 3

5

IMvxMessenger是一个插件,不需要按照您的方式注册 IoC。bootstrap通过为您要在项目中使用的每个插件创建一个类来注册插件,如下所示:

public class MessengerPluginBootstrap
    : MvxPluginBootstrapAction<Cirrious.MvvmCross.Plugins.Messenger.PluginLoader>
{
}

一些具有平台依赖部分的插件,例如 Visibility Plugin,需要在 iOS 上以不同的方式注册,因为它很傻:

public class VisibilityPluginBootstrap
    : MvxLoaderPluginBootstrapAction<Cirrious.MvvmCross.Plugins.Visibility.PluginLoader, Cirrious.MvvmCross.Plugins.Visibility.Touch.Plugin>
{
}

这样,您应该能够使用 IoC 使用插件内部的类型。

于 2013-10-02T20:22:23.217 回答
3

这听起来与ios7无关

代码行

CreatableTypes(typeof(IMvxMessenger).Assembly)
     .AsInterfaces()
     .RegisterAsSingleton ();

将要:

  • 获取程序集中的所有可创建类型(即任何具有公共构造函数的非抽象类型)
  • 然后会找到他们的接口
  • 然后将创建一个新实例并将其注册为接口的单例实现。

对于 Messenger 插件,这包括尝试 new 并将 an 注册MvxSubscriptionTokenIDisposable单例 - 尽管由于公共构造函数MvxSubscriptionToken需要 Guid 而失败(并且您还没有告诉 MvvmCross 如何提供它 - 所以构造失败)


如果您确实只想在程序集中注册特定类型,那么通常您会添加一个EndingWith("PostFix")子句 - 就像默认的 Mvx nuget 模板Services作为后缀一样。


如果您确实想从程序集中注册一个特定的类,那么您通常会这样做:

 Mvx.RegisterSingleton<IThing>(new Thing());

然而,对于插件——它们只是放置在 IoC 之上的一组基于约定的规则——你通常想要做的是为该插件调用EnsureLoaded()PluginLoader 的插件管理器。

最简单的方法是在 UI 项目中包含一个引导文件 - 请参阅 N=8 中的示例 - https://github.com/slodge/NPlus1DaysOfMvvmCross/tree/master/N-09-Location%20And%20Message /Location.Touch/Bootstrap - 您的应用程序的安装程序将使用反射来查找该类型,然后EnsureLoaded将为您调用插件。


有关 MvvmCross 中 IoC 的更多信息,请参阅https://github.com/slodge/MvvmCross/wiki/Service-Location-and-Inversion-of-Control

有关插件的更多信息,请参阅https://github.com/slodge/MvvmCross/wiki/MvvmCross-plugins

于 2013-10-02T20:27:33.707 回答
1

确保插件安装在 Core 项目和 Android 项目中。

于 2014-03-27T14:28:32.627 回答