2

私は、サービスロケータパターンを使用するDDDデータレイヤを持つフレームワークを持っています。しかし、現在私はすべての参照を格納するグローバルなstatic ServiceLocatorクラスを使用しています。クラスをIServiceProviderインターフェイスを実装し、グローバルな静的ServiceLocatorクラスを削除する正しい実装にこれをリファクタリングしたいと思います。サービスロケータパターンとDDD

は今、ほとんどどこでもエンティティクラスを除き、IServiceProviderインターフェースで既存のクラスを拡張する問題ではありません。問題は、エンティティクラスがIServiceProviderを実装する必要があることが非常に奇妙だと思うことですが、IoCコンテナを介してリポジトリを解決できるようにサービスプロバイダにアクセスする方法が必要です。

私のエンティティにIServiceProviderを実装しなくてもサービスロケータパターンを実装するにはどうすればよいでしょうか?

+1

あなたが参照しているパターンへのリンクを投稿することはできますか? – jgauffin

+0

Googleには良い結果がたくさんあります:http://www.google.com/search?q=service%20locator%20design%20pattern http://stefanoricciardi.com/2009/09/25/service-locator-pattern-in-csharpa-simple-example/のシリーズはもう少し詳しく説明しています。私が特に取り除こうとしているのは、シングルトンパターンです。 –

+0

はい、それはゼロになります。このパターンでは、すべてのエンティティがIServiceProviderを公開しません。 – TomTom

答えて

3

なぜheckがエンティティ(ビジネスオブジェクト)がIServiceProviderを公開するのでしょうか?それはビジネスオブジェクトであり、サービスではありません。また、IServiceProviderはサービスでもありません。サービスプロバイダを公開するためのIOCメカニズムです。

ORM /ビジネスオブジェクトフレームワーク/ランタイムはサービスプロバイダですが、個々のエンティティはありません。

は私が質問を返してみましょう:私は、エンティティがで開始するIServiceProviderを公開する任意の賢明なプログラミング概念を参照してくださいいけません。

は---

サービスを更新するだけでサービスロケータを提供する必要があります - あなたは1を持っている必要があります。定義されたスレッドがグローバルシングルトンを壊す要素(名前:例えばUI - UI要素はUIスレッドによってspecによってアクセスされなければならない)にアクセスする場合、スレッド静的変数を使用できます。

+0

私はグローバルなサービス(例えば認可)があり、どこでも利用できる必要があるからです。 –

+0

はい、これらはエンティティではなく、サービスです。また、tehyはIServiceLocatorを実装しませんが、ServiceLocatorを通じて公開されます。 DependentInjectorや別の中央のコンポジションコンテナ/サービスロケータ(たとえばウィンドウごと)を使用して逃げることもできますが、すべてのエンティティが1つに変わるパターンはありません。 – TomTom

+0

しかし私はそれらを私のビジネスロジックに必要としています。私が持っている問題は、ビジネスロジックからこれらのサービスにアクセスする良い方法が必要だということです。 –

3

Aサービスロケータは、ユニティ、城ウィンザー又はNInjectなどのコントロールコンテナの反転との組み合わせで最もよく使用されています。 Unityで動作するサービスロケータの例については、http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocatorを参照してください。

そしてサービスロケータはアンチパターンとして見ることができることを覚えておいてください - それは非常に慎重に使用する必要があります。代わりに、コンストラクタまたはプロパティの注入を使用する方がはるかに優れています。しかし、依存関係が実行されている機能に非常に依存している場合、Service Locatorには場所があります。

+0

私はCastle Windsorを使用します。しかし、私はすべての依存関係を通過させることは現実的ではないと思います。常にコンストラクタ。私は、サービスロケータパターンを、いくつかのグローバルサービス(例:承認。 –

+0

スレッドスタティックアクセサを使用することになったことはありますか?それとも、私はいつもそうしています(後で)。 – TomTom

+0

@トムトム:投稿の構成は、私がそれに属していないものでエンティティを汚染していることを意味すると思います。私はスレッドの静的なアクセサが行く方法だろうと思う。あなたがあなたの答えを更新するなら、私はそれを受け入れるでしょう。 –

0

あなたのコメントにService Locatorパターンを参照しています。それに応じて質問を編集してください。今日

ほとんどのアプリケーションでは、代わりにサービスロケータパターンの依存性注入の原理(SOLID原則でD)を使用しています。 DIPを開始する最も簡単な方法は、Autofacのようなコントロールコンテナの逆変換を使用することです。

サービスロケータのアイデアは、サービスを検索するためのクラスがあることです。これを実現するには、すべてのサービスを登録するための登録メカニズムが必要です。

典型的なスタートアップ:

serviceLocator.Add(new MyService()); 

以降の使用

serviceLocator.Get<MyService>(); 

私はそれを持っているクラスの依存関係それはたくさん明確になりますので、あなたの代わりにDIPを使用することをお勧めします。

+0

質問が更新されました。 –