1

この質問は、プログラマーズスタックの方が適切かもしれません。もしそうなら、私はそれを動かすでしょう。しかし、私はここでより多くの答えを得るかもしれないと思う。ドメインクラスでサービスロケータパターンを使用することは時々大丈夫ですか?

これまでのところ、私のドメイン内のすべてのインターフェイス依存関係は、実行中のアセンブリからDIを使用して解決されています。これは現在、.NET MVC3プロジェクト(+ Unity IoCコンテナ)です。しかし、私はサービスロケータがより良い選択かもしれないと思うシナリオを走ってきました。

URLにコンテンツを格納(キャッシュ)するエンティティがドメイン内にあります。具体的には、SAML2 EntityDescriptor XMLをメタデータURLから格納します。私は、単一のメソッドとのインタフェースIConsumeHttpを有する:

public interface IConsumeHttp 
{ 
    string Get(string url); 
} 

現在の実装では、System.Net静的WebRequestクラスを使用する:

public class WebRequestHttpConsumer : IConsumeHttp 
{ 
    public string Get(string url) 
    { 
     string content = null; 
     var request = WebRequest.Create(url); 
     var response = request.GetResponse(); 
     var stream = response.GetResponseStream(); 
     if (stream != null) 
     { 
      var reader = new StreamReader(stream); 
      content = reader.ReadToEnd(); 
      reader.Close(); 
      stream.Close(); 
     } 
     response.Close(); 
     return content; 
    } 
} 

XMLコンテンツをキャッシュエンティティが非ルートとして存在しますはるかに大きなエンティティ集合体である。残りの集計では、MVCコントローラのパブリックエンドポイントであるやや大きなFacadeパターンを実装しています。私はそうのようなファサードのコンストラクタでIConsumeHttp依存性を注入できます。

public AnAggregateFacade(IDataContext dataContext, IConsumeHttp httpClient) 
{ 
    ... 

私はこれを見問題はファサードで唯一の方法は、このインターフェイスに依存しているということなので、ためにそれを注入する愚かなようです全面ファサード。 WebRequestHttpConsumerクラスのオブジェクトの作成でオーバーヘッドが増えることはありませんが、ドメインはこれを認識しません。

代わりに、エンティティのキ​​ャッシングロジックをすべて別の静的ファクトリクラスに移動することを検討しています。それでもコードはIConsumeHttpに依存します。だから私はIConsumeHttpを解決する静的なファクトリメソッド内の静的なサービスロケータを使用することを考えていますが、キャッシュされたXMLを初期化またはリフレッシュする必要があるときだけです。

私の質問:これは悪い考えですか? XMLメタデータが適切にキャッシュされていることを確認するのは、ドメインの責任である必要があります。ドメインは、SAML Authn要求のメタデータ(&レスポンス、SAML EntityIDまたはメタデータURLの更新など)を他の関連操作の一部として定期的に実行します。それともあまりにも心配していますか?

+1

関連:http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven

+0

これは有効な質問ですそう。 – Steven

+0

@Stevenはあなたのアーキテクチャのクエリー+コマンド面をどのようにロールしているかについてのリンク、信頼の投票、そしてあなたのブログを感謝します。非常に面白いもの。 – danludwig

答えて

0

あなたのドメインは、メタデータ操作について実際にある場合を除き、私は、それについてはよく分からないXMLメタデータが適切に

にキャッシュされていることを確認し、それが に、ドメインの責任であることを私には思えません、httpリクエストなどが含まれます。ノンテクニカルドメインを持つ「通常の」アプリケーションでは、インフラストラクチャ/テクニカルサービス層でのキャッシュに関する問題に取り組んでいます。私はこれで見問題は、明らかに 全体のファサードのため

それを注入する愚かなようですので、ファサードで唯一の方法は、このインターフェイスで 依存性を有していることである

、通常ファサード彼らは自然に多くの依存関係を指す傾向があるので、コンストラクタインジェクションに非常によく役立ちません。あなたは、他のタイプの注射を考えたり、あなたが指摘したように、ロケーターを使ったりすることができます。しかし、私が個人的にやっていることは、ファサードが本当に適切かどうかを自問し、すべてのコントローラで同じ大きなインターフェースの代わりに細かいオブジェクトを使うことを検討することです。これは、大量のオブジェクトを前もって膨張させるのではなく、モジュール化とアドホック注入を可能にします。

しかし、私は大きなファサードファンではないので、それはちょうどかもしれ; @ ian31へのコメントで)

+0

入力いただきありがとうございます。ドメインはHTTPに関するものではなく、System.Web、MVC、またはそのようなDLLを参照しないため、インターフェイスでHttpConsumerをラップしています。これがドメインで使用される唯一のケースです。コントローラはSAML httpのものを扱い、Authn要求の送信などのopsのメタデータを使用します。コントローラにドメインが正しいXMLを持つことを確実にするように思えるように見えますが、クライアントにあまりにも多くの責任を与えすぎるほど細かいです。ドメインはすでにURLを認識しており、これを行うことができます。あなたはポイントを持っていると私は他のパターンを探しています。 – danludwig

0

、あなたが言及し、「それは、コントローラは、ドメインが正しいXMLを持って確保することのように思えるが、あまりにも粒状でありますクライアントにあまりにも多くの責任を与える "このため、コントローラーが現在のXMLの正しい&に対してサービス/リポジトリ(キャッシングレイヤーを実装できる)を要求することをお勧めします。私にとっては、この責任はドメインエンティティにはたくさんあります。

しかし、あなたが概説した責任でOKであり、オブジェクトの作成があまりオーバーヘッドではないと言えば、IConsumeHttpをエンティティに残しても問題ないと思います。
この責任を負う別のアプローチは、このインターフェイスを子エンティティに移動することです。これがあなたのケースで可能だったならば、少なくとも依存関係はそれを必要とするシナリオに限定されています。

+0

お返事ありがとうございました。ご返信ありがとうございます。このプロジェクトでは、サービス層はありません。 MVCプロジェクトは、ファクトリ&ファサードパターンを使用してドメインサーフェスに直接アクセスします。 IConsumeHttp依存関係は、ドメインエンティティ上に存在せず、別のドメインクラス上にあります。最終的に、メタデータはドメインエンティティプロパティに格納されますが、HTTPルックアップを実行するエンティティではありません。また、私が "キャッシュ"と言うとき、私はインメモリキャッシュの使用を意味しません。つまり、XMLコンテンツはエンティティに格納され、メタデータURLを使用して定期的にリフレッシュされます。 – danludwig

関連する問題