この質問は、プログラマー スタックにより適している可能性があります。もしそうなら、私はそれを移動します。しかし、ここでもっと多くの答えが得られると思います。
これまでのところ、ドメイン内のすべてのインターフェイスの依存関係は、実行中のアセンブリからの DI を使用して解決されています。これは、現時点では .NET MVC3 プロジェクト (+ Unity IoC コンテナー) です。ただし、サービスロケーターの方が適していると思われるシナリオに出くわしました。
URL からのコンテンツを格納 (キャッシュ) するエンティティがドメイン内にあります。具体的には、メタデータ URL から SAML2 EntityDescriptor XML を格納します。単一のメソッドを持つインターフェイス 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)
{
...
これで私が目にする問題は、ファサード内の 1 つのメソッドだけがこのインターフェースに依存しているため、ファサード全体にそれを注入するのはばかげているように思われることです。クラスのオブジェクト作成によってWebRequestHttpConsumer
多くのオーバーヘッドが追加されることはありませんが、ドメインはこれを認識していません。
代わりに、エンティティのすべてのキャッシュ ロジックを別の静的ファクトリ クラスに移動することを検討しています。それでも、コードは に依存しIConsumeHttp
ます。そのため、静的ファクトリ メソッド内で静的サービス ロケーターを使用して IConsumeHttp を解決することを考えていますが、キャッシュされた XML を初期化または更新する必要がある場合のみです。
私の質問: これは悪い考えですか? XML メタデータが適切にキャッシュされていることを確認するのは、ドメインの責任であるべきだと私には思えます。ドメインは、他の関連操作 (SAML Authn 要求と応答のメタデータの取得、SAML EntityID またはメタデータ URL の更新など) の一部として定期的にこれを行います。それとも私が気にしすぎているだけでしょうか?