問題タブ [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.
dependency-injection - verifiying IoC、Ioc Container、DI、サービスロケーターの違いを理解しています
3 つのイディオムの違いについては、多くの投稿をお読みください。しかし、さらに混乱して、次の記事に出くわしました: http://martinfowler.com/articles/injection.html
これが正しいかどうかを確認したいだけです。私が間違っている場合は修正してください。訂正・追加をお知らせください:
IoC は、アプリケーションが使用するサービスの実装からアプリケーションを切り離すという概念です。アプリケーションには Iservice への参照が含まれており、具体的なサービスのインスタンス化は担当していません。
これを実現するには、少なくとも 2 つの方法があります。
DI - 具体的なサービスは、ctor パラメータとして注入される/setter をスローする/インターフェース注入をスローする (後者はどういう意味ですか? )
ServiceLocator - アプリケーションが必要とする可能性のあるすべての具体的なサービスを認識するコンポーネントです。アプリケーションは、Locator から具体的なサービスを明示的に要求します。
*IoC コンテナーは、実際にはコントロールのファクトリー (「プロバイダー」) です。
この記事の「いつ (1) または (2) を選択するか」という部分に少し混乱しました。誰かが自分の経験から素人の言葉で教えてもらえますか?
「Service Locator は、より単純な動作のため、わずかに優れています。ただし、複数のアプリケーションで使用するクラスを構築する場合は、依存性注入を選択することをお勧めします。」--> locator はどのようにより単純なのか? メソッド呼び出しを明示的に使用するためですか?複数のアプリケーションがある場合、DI を使用すると何が良いでしょうか?
c++ - Service Locator パターンについて
Service Locator は非常に便利な概念のようで、自分のアプリに実装したいと考えています。ただし、それをどのように実装するか、および他のプログラミング パラダイムと組み合わせて使用する方法について、いくつか質問があります。
SL は、格納しているサービスを管理する必要がありますか? つまり、SL が破棄された場合、サービス自体も破棄する必要がありますか、それともサービスを登録した人に任せるべきでしょうか?
依存性注入はどうですか?SL を取得したので、SL をパラメーターとして渡すことに意味はありますか、それともグローバルにアクセスする必要がありますか? 結局のところ、DI の全体的な目的の多くは SL でもカバーされるので、多くの関数をもう 1 つのパラメーターで乱雑にしたくありません。
asp.net-mvc - MVC3、Ninject、MvcSiteMapProvider-オーバーライドされたメソッドに依存性を注入する方法
NinjectとMvcSiteMapProviderを使用しているMVC3アプリケーションがあります。
MvcSiteMapProviderがサイトマップにノードを動的に追加するために使用するこのクラスを作成しました。
MvcSiteMapProviderはこのタイプ自体をインスタンス化するため、リポジトリをインジェクトする方法がわかりません。
カーネルのハンドルを取得し、メソッドを呼び出すことで、サービスの場所を使用することを考えGet<Repository>()
ました。しかし、NinjectHttpApplicationの定義を見ると、このプロパティがわかりました。
Do not use Ninject as Service Locator
?!他にどのようにこれを行うことになっていますか?次に、stackoverflowでこの質問を見つけました。すべての回答で、ServiceLocationを使用しないでください。
私はどうしたらいいですか?
data-binding - EntryPointNotFoundException - Expression Blend 4 で MVVM Light View をロードするときにエントリ ポイントが見つかりませんでした
この質問を投稿しているのは、解決するのが非常に難しく、時間がかかることがわかったので、解決策を文書化できるようにするためです。
私はSilverlight 4 プロジェクトでLaurent Bugnion の優れたMVVM Light Toolkitを使用しており、Microsoft.Practices.ServiceLocation で彼のViewModelLocatorパターンを使用しています。Blendability の設計時モデルをロードするための ServiceLocator 。最初に、 Expression Blend 4でのビューの読み込みは機能しており、設計時のデータ バインディングは優れていました。これは、Blend でエラー メッセージが表示されることなく、ある時点で機能しなくなりました。
Visual Studio 2010 SP1を使用してBlend.exeにアタッチし、問題をデバッグしました。EntryPointNotFoundException (エントリ ポイントが見つかりませんでした) 例外は、次のコード行でスローされていました。
奇妙なことに、デザイン時のデータ バインディングが正しく機能している状態で、Visual Studio XAML デザイナーに同じビューを正常に読み込むことができました。別の Visual Studio インスタンスを使用して、XAML デザイナーをホストする Visual Studio インスタンスにデバッガーをアタッチし、ServiceLocator 呼び出しが正常に実行されていることを確認できました。
例外の詳細 (スタック トレース、InnerExcetion など) からは、問題に対するこれ以上の手がかりは得られず、役に立たないエラー メッセージをインターネットで検索しても、それ以上の情報は得られませんでした。
最終的に、Visual Studio のイミディエイト ウィンドウを使用して、問題の原因となっているコード行の一部を実行することで幸運に恵まれ、はるかに優れたエラー メッセージが表示されました。
タイプ 'Microsoft.Practices.ServiceLocation.ServiceLocator' は、'Microsoft.Practices.ServiceLocation.dll' と 'Microsoft.Practices.ServiceLocation.dll' の両方に存在します。
変更セットを以前に動作していたコードと比較すると、GalaSoft.MvvmLight.Extras.SL4 への参照をSilverlightプロジェクト (UI プロジェクトを参照する)の別の単体テスト フレームワークに追加したことに気付きました。このテスト プロジェクトは C:\Program Files (x86)\Laurent Bugnion (GalaSoft)\Mvvm Light Toolkit\Binaries\Silverlight4 からアセンブリを参照していましたが、UI プロジェクトは ..\packages\MvvmLightLibsPreview.4.0.0\ から参照していました。 lib\SL4. ナゲットパッケージMvvmLightLibsPreviewを使用して、MVVM Light をクライアント プロジェクトに追加しました。
ブレンド結果 - エラーと出力ウィンドウには、どの時点でもエラー メッセージは表示されませんでした。明らかに、問題をより迅速に把握するのに役立つ Blend のトラブルシューティング手法がない限り、本当の答えは必要ありません。
c# - Service Locator パターンを使用した場合に MongoDB が DateTime を格納する方法を処理する
私の同僚と私は討論で行き詰まっており、他の人の意見は大歓迎です。
Service Locator パターンと共通インターフェイスを利用してすべてのデータ アクセスを抽象化し、ニーズの変化に応じて異なるデータ ソース間で簡単に交換できるようにします。呼び出しコードには、データがどこにどのように保存されているかは示されていません。サービス レジストリから供給されるサービスを介してデータにアクセスするだけです。
私たちが議論している問題は、オブジェクトに DateTime フィールドがあり、それを MongoDB データソースに保存するときに発生します。
私が気付いたのは、C# に DateTime を持つオブジェクトがある場合、それは正しい時刻として表示されるということです。MongoVUE で MongoDB サーバーにログインしてオブジェクトを調べると、正しい時刻が表示されます。しかし、オブジェクトを取得すると、DateTime は UTC になります。これにより、メモリ内の DateTime を MongoDB データ ソースから取得されたオブジェクト内の DateTime と比較するときに明らかに問題が発生します。
Mongo は DateTime を UTC 時間として内部的に保存することを理解しています。呼び出したときに UTC が返される理由も理解できます。
ここから議論が始まります。
これは単に表面的な問題であり、日付を表示するときの問題であることが示唆されています。したがって、インターフェイス層内で単に .ToLocalTime を呼び出す必要があります。私はこれに同意せず、サービス ロケーター パターンを実装する際に作成した抽象化のレイヤーを危険なほど壊すと断言します。また、他のイベントのトリガーに関連するため、これらの日時との相互作用に関する疑問も生じます。
私が他の場所で読んだことは、時間を文字列として、特にUTC形式の標準として保存する必要があるということです。このように、インターフェイス レイヤーは、DateTime がどのように格納されているかを認識したり気にしたりしません。また、すべてのデータ ソースがその文字列を同じ方法で格納するため、オブジェクトも認識しません。
私は ISO 1806 形式を使用してこれを行うことに成功しましたが、同僚はこれが「ハッキー」な修正であり、.toLocalTime を使用することがこの状況に対処する適切な方法であると感じています。
このトピックについて他の人が何を言おうとしているのかに興味があります。
ご入力いただきありがとうございます。
generics - Unityコンテナーで解決されたジェネリックインターフェイスをコンストラクターパラメーターとして使用してジェネリッククラスを解決する方法
Unity(2.0)コンテナにジェネリックインターフェイスが挿入されたジェネリック抽象クラスを登録する方法がわかりません。インターフェイスとクラスは次のとおりです。
登録コードは次のとおりです。
これが私のプロバイダーファクトリで、解決しようとしていますReportProvider<,>
:
「ReportProvider`2タイプを作成できません。この値を指定するようにコンテナーを構成する必要があります」という_serviceLocator.GetService(...)
行が表示されます。
ioc-container - Service Resolution/Location and Parameters
How would you pass parameters to a resolver to create an object?
I have a UoW object which I want to pass into a data service objects, I want to be able to ensure that the data service objects created in a particular sequence are created using the one UoW object
for example
Option 1, pass IUoW into the Resolver.GetService call - there is no knowledge of the constructors for IDataServiceX implementations
Option 2, add a property to IDataServiceX for IUoW - not setting it would be easily done, how would a programmer know this property was required to be set
inversion-of-control - SpecflowとWatiNを使用したIOC(simpleServiceLocator)セットアップテスト
SpecflowとWatiNを使用していくつかの受け入れテストを行っていますが、IOCコンテナー(SimpleServiceLocator)の登録をどこに設定すればよいかわかりません。
私のウェブサイトでは、登録は私のglobal.asaxで行われます。
私のテストプロジェクトでは、[BeforeScenario]メソッドから次のようなコードを使用してそれらを設定しようとしました。
そして、アプリケーションプロジェクトでオブジェクトインスタンスを取得します。
しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。ServiceLocator.Currentがnullであるため..。
php - 次の例で、Service Locatorがアンチパターンである理由は何ですか?
ドメインモデルが明確に定義され、エンティティ、リポジトリ、サービスレイヤーを備えたMVCアプリケーションがあります。
コントローラー内でサービスクラスをインスタンス化する必要がないように、つまりコントローラーをそれらに適さないロジックで混乱させるために、一種のサービスロケーターとして機能するヘルパーを作成しましたが、少し読んだ後、多くの開発者が気づきました:
- http://blog.tfnico.com/2011/04/dreaded-service-locator-pattern.html
- http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
- http://underground.infovark.com/2010/06/18/the-service-locator-pattern-is-the-new-global-variable/
- http://www.andyfrench.info/2011/05/service-locator-anti-pattern_17.html
ServiceLocatorは実際にはアンチパターンであると言います。しかし、私の実装はアンチパターンではないと思います。
彼らがServiceLocatorをアンチパターンと見なす理由は、依存関係を非表示にするためですが、必要な唯一の依存関係(Entity Managerであり、この依存関係はServiceインターフェイスのシグネチャにあるため変更されない可能性があります)を挿入しますサービスクラスによって、サービスロケーターをインスタンス化するときに。
これが私のコードです:
アクションヘルパーをフロントコントローラーに登録する:
そして、コントローラーでこのヘルパーをどのように使用するか:
- 私の実装は正しいですか?
- それは本当にアンチパターンですか?
- 私が直面する可能性のある問題は何ですか?
- コードをリファクタリングしてこのアンチパターンを排除し、機能を継続するにはどうすればよいですか?
c# - ドメイン駆動設計:サービスロケーターを使用せずにエンティティから構成された値にアクセスします
その特定のものがシステムに必要なセキュリティの質問の数に答えたかどうかを示すプロパティを持つUser
エンティティがあります。システムに必要なセキュリティの質問の数は構成可能であり、構成ファイルから取得されます。クラスは構成された情報にどのようにアクセスする必要がありますか?HasCompletedSecurity
User
User
現在、IConfigurationService
インターフェイスがあり、その背後に、ConfigurationManager
またはAzureと同等の機能が利用可能な場合はそれを使用する実装があります。静的クラスを介してDIコンテナへのアクセスをカプセル化し、InjectionService
現在、次のように構成された値を解決しています。
これはもちろんServiceLocatorアンチパターンの例であり、私はそれが少し好きではありません。静的な依存関係により、このクラスを使用するものはすべてユニットテストが厄介になります。
私はEntityFrameworkを使用していて、ここからキューを取得しています。エンティティをDIコンテナーに渡して依存関係を与えたくないので、代わりに構成された値にどのようにアクセスする必要がありますか?
編集:この正確な例を片側に(そしてその正しいアーキテクチャに関する提案に感謝します)、私が興味を持っているより大きな質問は、エンティティからのサービスへの非静的参照をどのように管理するかです。あなたが決して必要としないような方法でエンティティを設計するだけの答えはありますか?