1

Web APIサービスのすべてのデータベース呼び出しでホスト名を要求して、フィルタリングを適用する必要があります。

このフィルタリングは次のように機能します。

  1. 要求しているホスト名に基づいて、プロファイルするサイトを検索します
  2. リクエストで行われた後続のすべてのデータアクセス呼び出しにSite.Idを適用します

基本的にグローバルフィルターであるため、APIサービスによって返されるデータは常にホストに含まれます。

1つの解決策は、次のように、すべてのサービスメソッドの引数としてホスト名を渡すことです。

public IEnumerable<Profiles> GetProfiles ()
{
 var host = HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
 return profilesService.Get(host);
}

しかし、これはすべてのリクエストで一貫したルールであるため、これを処理するためのより洗練された方法を考え出し、サービス呼び出しが単なるprofileSerivce.Get()であるようにします。

ISiteLocatorをサービスレイヤーに挿入する必要があると思います。このサービスレイヤーには、ホスト名か、データベースから既に取得したIDを適用して適用することができます。しかし、HttpContextを参照してホスト名を取得する方法と場所、およびStructureMapライフサイクルを使用してこれを最適化できるかどうかについて、これに苦労しています。

4

1 に答える 1

2

ISiteLocatorをサービスレイヤーに挿入する必要があると思います

あなたは正しい方向に向かっているように私には思えます。

HttpContextを参照する方法と場所についてこれに苦労しています

これは実際には本当に簡単です。ISiteLocatorビジネスレイヤーでを定義し、ASP.NET Webアプリケーションへの実装AspNetSiteLocatorを定義します。できれば、Composition Rootの近く(または内部)に実装します。その実装は次のようになります。

public class AspNetSiteLocator : ISiteLocator
{
    private readonly ISiteRepository siteRepository;

    public AspNetSiteLocator(ISiteRepository siteRepository)
    {
        this.siteRepository = siteRepository;
    }

    Site ISiteLocator.GetCurrentSite()
    {
        return this.siteRepository.GetById(CurrentHostName);
    }

    private static string CurrentHostName
    {
        get
        {
           return HttpContext.Current.Request
               .ServerVariables["SERVER_NAME"];
        }
    }
}

ホスト名、またはデータベースからすでに取得されているIDのいずれかが含まれている

ISiteLocatorそのロケーターの消費者にとって最も便利な方法でデータを返すようにしてください。私の例では、Siteエンティティを返しました(ドメインにそのようなエンティティがある場合)。これは、ホスト名やIDよりもおそらく便利です。これは、消費者が自分でサイトを再度照会する必要がある可能性があるためです。ただし、おそらくIdが最も便利ですが、それを見つけるのはあなた次第です。

StructureMapライフサイクルを使用してこれを最適化する方法[...]

上記の実装には状態がないため、任意のライフタイムで登録できます。たとえばシングルトン。ただし、を呼び出すたびにISiteLocator.GetCurrentSite()、への新しいリクエストが発生しISiteRepository、オーバーヘッドが大きくなりすぎる可能性があります。その場合Site、プライベートフィールドにを格納し、常にそのインスタンスを返す実装が必要になる可能性があります。その場合、その実装を「Webリクエストごと」に登録する必要があります(リクエストSERVER_NAME中には変更されないため)。

于 2012-09-29T09:34:10.250 に答える