問題タブ [common-service-locator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IServiceLocator.GetInstance(Type) の意図は、IServiceProvider.GetService(Type) の意図とどのように異なりますか?
IServiceProvider.GetService(Type serviceType)
メソッド署名との意図に違いはありIServiceLocator.GetInstance(Type serviceType)
ますか? もしそうなら、違いは何ですか?
私は常にそれらを同等のものとして扱ってきましたが、一貫性を保つために単一の方法を使用することにしました。これは 2 つのインターフェイスを扱うのに十分な解決策のように思えますが、正しい場所で正しいものを使用していることを確認できるように、それらの使用法が実際にどのように意図されていたかを知りたいと思っています。 それらの意図が実際に同じである場合、同じ目的のために複数のセマンティクスのセットを持つ理由はありますか? (の開始時に署名が推奨されていたことは理解していGetInstance
Microsoft.Practices.ServiceLocation
ますが、これは重複を導入する正当な理由とは思えません)。
なぜ私は混乱しています
以下は、この質問に対する答えを見つけようとして見つけた矛盾する事実と、それに対する私の解釈のリストです。これらを含めているのは、このトピックについて既に知られているすべての情報のコンテキストで私の質問に対処できるようにするためです.
のMSDNドキュメントに
IServiceProvider
は、GetService(Type serviceType)
メソッドが返す必要があると書かれていますタイプserviceType のサービス オブジェクト。
- または - serviceType型のサービス オブジェクトがない場合は
null。のMSDN ドキュメントに
IServiceLocator
はメソッドのドキュメントがありませんが、VS オブジェクト ブラウザの概要にはGetInstance(Type serviceType)
、メソッドが「要求されたサービス インスタンス」を返すと記載されています。ただし、ドキュメントIServiceLocator
には、サービス インスタンスの解決中にエラーが発生した場合に をスローするActivationException
必要があるという例外エントリもあります。ActivationException
が導入されてから数年後に導入されたMicrosoft.Practices.ServiceLocation
名前空間にありますIServiceProvider
。IServiceProvider
したがって、が例外を参照していないことは理解できます。そうは言っても、IServiceLocator
インターフェイスのドキュメントにはnull
、結果が見つからない場合に戻ることについては何も書かれていません。また、要求されたサービス タイプの実装の欠如が例外を構成する必要があるかどうかも明らかではありません。サービス タイプの実装がない場合、
ActivationException
inIServiceLocator
実装が発生する必要がありますか? それのようには見えません。の実装テンプレートIServiceLocator
は、null 以外の事後条件の概念 を無視します。の実装テンプレートも、 の代替構文として
IServiceLocator
扱います。これは Liskov の違反 (基本型で宣言されていないサブタイプで例外をスローするため) と見なされますか? それとも、インターフェイスのメソッド シグネチャで宣言された例外ではなく、実際に実装に違いが必要でしょうか? 私が得ているのは、実装テンプレートが両方のインターフェースを正しく実装していると確信していますか? 呼び出しを try ブロックでラップし、例外がキャッチされたときに戻る というインターフェイスの意図をより適切に表現できますか?IServiceProvider.GetService(Type)
IServiceLocator.GetInstance()
ServiceLocatorImplBase
IServiceLocator
IServiceProvider
GetInstance
null
補遺:これに関連するもう 1 つの問題は、への対応
IServiceLocator.GetAllInstances(Type)
ですIServiceLocator.GetInstance(Type)
。具体的には、任意の型 T について、 の実装はIServiceLocator.GetAllInstances(typeof(T))
と同じ結果を返す必要がありIServiceLocator.GetInstance(typeof(IEnumerable<>).MakeGenericType(typeof(T))
ますか? (これがIServiceProvider
通信にどのように関係しているかは簡単にわかりますが、質問を単純にして、この場合は同じインターフェースの 2 つのメソッドのみを比較する方がよいと思います。)
visual-studio - パッケージが NuGet マネージャーの [更新プログラム] に表示され、削除できません
これは私がかなり長い間抱えていた問題ですが、このプロジェクトを仕事で締めくくっているので、ようやく解決できるかもしれないと思っていました. NuGet パッケージの更新を確認すると、リストには常にこれが表示されます (+ 実際に利用可能な更新)。
更新をクリックすると、次の画面が表示されます。
チェックボックスを選択できません。ご覧のとおり、デフォルトではチェックされていません。これは、プロジェクトにこのパッケージがインストールされていないことを意味します。[OK] をクリックしても [キャンセル] をクリックしても、常に最初のスクリーンショットに戻ります。スクリーンショット 3 でわかるように、パッケージはインストール済みリストにも表示されていません。
packages.config ファイルにもありません。Uninstall-Package CommonServiceLocator を書くと、次のようになります。
PM> Uninstall-Package CommonServiceLocator
Uninstall-Package : Unable to find 'CommonServiceLocator' in 'ManagementSystem' and found multiple versions of 'CommonServiceLocator' installed. Please specify a version.
At line:1 char:18
+ Uninstall-Package <<<< CommonServiceLocator
+ CategoryInfo : NotSpecified: (:) [Uninstall-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.UninstallPackageCommand
インストールされていないため、バージョンを指定できません。パッケージをpackages.configファイルに手動で追加してから、インストール済みリストからアンインストールすることさえ試みました。次に、NuGet マネージャーでインストールとアンインストールを試みました。まだ同じ。これはあなたに起こったことがありますか?どのように解決しましたか (プロジェクト全体の再作成を除く)? ありがとう!
mvvm-light - プロジェクトが System.ComponentModel アセンブリを参照できないのはなぜですか?
私のプロジェクトは .NET Framework 4.5 に設定されています。WPF プロジェクトで SimpleIOC (MVVM Light から) を使用しようとすると、次のエラーが発生します。
Error 3 Reference required to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' containing the implemented interface 'System.IServiceProvider'. Add one to your project.
なぜこのエラーが発生するのかわかりません。私が理解していることから、これは mscorlib クラスなので、どこから System.ComponentModel を取得しているのかわかりません。
Dim test As IServiceProvider
コンパイラが文句を言うことなく書くことができます。何らかのバージョンの問題がありますか?
xamarin - MvvmLight の SimpleIoc は、Xamarin Forms 1.3 Android および iOS アプリでは機能しませんが、Windows Phone では機能しません
私は Xamarin Forms アプリに取り組んでおり、Windows Phone のビルドと実行はすべて順調に進んでいます。ただし、Android バージョンを実行しようとすると、正常にビルドされてから失敗し、ViewModelLocator で ViewModel を解決するために ServiceLocator を呼び出すときに例外が発生します。
ViewModelLocator の改行
と
「GetInstance」ショーにカーソルを合わせます
私のViewModelの唯一のコンストラクタは次のようになります
すべての依存関係は、ViewModelLocator
たとえば、これに先立って登録されます
MainActivity.cs (Android) および AppDelegate(iOS) などのプラットフォーム固有のものもあります。
私が得られないのは、Windows Phone で美しく動作するということですか? Android との違いは何ですか? Xamarin 1.3 以降で SimpleIoc を使用した人はいますか?
ビューモデルを作成するためにファクトリを使用する必要がありますか?
どんな助けでも大歓迎です。MVVMLight (5.1.0.1) と Xamarin (1.3.3) のすべての最新バージョンを使用しています。
.net - WindsorCastle を使用した MvvmLight: Microsoft.Practices.ServiceLocation の競合
.NET プロジェクトにインストールしました。
- MvvmLight v5.4.1.1
- Castle.Windsor v5.0.0
- CommonServiceLocator v2.0.2
- CommonServiceLocator.WindsorAdapter.Unofficial v3.3.0
次に、このようにコンテナを初期化します
このエラーが発生します:
タイプ 'ServiceLocatorImplBase' は、参照されていないアセンブリで定義されています。アセンブリ 'Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' への参照を追加する必要があります。
基本的に、MvvmLight v5.4.1.1 は CommonServiceLocator v2.0.2 を想定しており、CommonServiceLocator.WindsorAdapter.Unofficial は CommonServiceLocator v1.3.0 を想定しており、CommonServiceLocator.WindsorAdapter は CommonServiceLocator v1.0.0 を想定しています。
1 つの解決策は、CommonServiceLocator を v1.3.0 にダウングレードすることです。これは機能しますが、MvvmLight も v5.3.0 にダウングレードされます。
これを行う正しい方法は何ですか?MvvmLight と Windsor Castle を連携させるにはどうすればよいですか?