1

IoC を使用して IMvxMessenger をアクティブ化する際に問題が発生しています。(Mac、Xamarin Studio、iOS7、Mono 3.2)

NPlus1DaysOfMvvmCross をダウンロードし、N37 Maps プロジェクトをロードしました。

プロジェクトをコンパイルし、正常に動作します。

次に、プロジェクトに Cirrious.MvvmCross.Plugins.Messenger.dll を追加し、サービス IoC 呼び出しのすぐ下の app.cs Initialize に次のコードを追加しました。

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

コンパイル時に次のエラーが表示されます: Cirrious.MvvmCross.Plugins.Messenger.MvxSubscriptionToken の作成時に Guid 型のパラメーター ID のパラメーターを解決できませんでした

4

3 に答える 3

3

これはios7とは関係ないようです

コード行

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

意思:

  • アセンブリ内のすべての作成可能な型 (つまり、パブリック コンストラクターを持つ非抽象型) を取得します。
  • 次に、それらのインターフェースを見つけます
  • 次に、新しいインスタンスを作成し、それをインターフェイスのシングルトン実装として登録します。

MvxSubscriptionTokenMessenger プラグインの場合、シングルトンとしてを新規作成して登録しようとすることも含まれIDisposableますが、パブリック コンストラクターがMvxSubscriptionTokenGuid を必要とするため失敗します (そして、MvvmCross にそれを提供する方法を伝えていないため、構築は失敗します)。


アセンブリに特定の型を登録するだけの場合は、通常、EndingWith("PostFix")句を追加します - デフォルトの Mvx nuget テンプレートがServices接尾辞として行うように。


アセンブリから単一の特定のクラスを登録したい場合は、次のように行うことがよくあります。

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

ただし、プラグイン (IoC の上に配置された単なる規則ベースのルール セット) の場合、通常はEnsureLoaded()、そのプラグインの PluginLoader のプラグイン マネージャーを呼び出す必要があります。

これを行う最も簡単な方法は、UI プロジェクトに Bootstrap ファイルを含めることです - N=8 の例を参照してください - https://github.com/slodge/NPlus1DaysOfMvvmCross/tree/master/N-09-Location%20And%20Message /Location.Touch/BootstrapEnsureLoaded - アプリケーションの Setup は Reflection を使用してその Type を見つけ、プラグインを呼び出します。


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 に答える