6

インターフェイスに基づいてデータを取得するテナントリポジトリのインスタンスを挿入するために、マルチテナント ASP.NET MVC アプリケーションに StructureMap を実装していITenantContextます。問題のは、ベース コントローラのTenantから決定されます。RouteData OnActionExecuting

テナント ID が自分または一部のベース コントローラー プロパティTenantContext(tenantID);から派生する場所を構築するように StructureMap に指示するにはどうすればよいですか?RouteData

ベースコントローラー

次のルートを考えます。

{tenant}/{controller}/{action}/{id}

Tenant私の基本コントローラーは、{tenant} URL パラメーターに基づいて正しいものを取得して保存します。を使用するTenantと、 を含むリポジトリをITenantContext構築して、そのテナントに関連するデータのみを取得できます。

他のDIの質問に基づいてAbstractFactory、解決策になるでしょうか?

4

2 に答える 2

7

発見したように、挿入されたサービスでは利用できないため、テナントをコントローラーに保存しないでください。テナント ID の決定のみを担当するシン サービスを作成します。サービスは statics と HttpContext に直接アクセスできます。このクラスは、単体テスト可能である必要はありません。その目的は、システムの残りの部分を分離して、他のクラスをテスト可能にすることです。

ITenantContextそのサービスになりたい場合は、次のようになります。

public class TenantContext : ITenantContext
{
    public string GetTenant()
    {
        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
        return routeData.GetRequiredString("tenant");
    }
}

これで、コントローラーはリポジトリ インターフェイスに依存するだけでよく、リポジトリの実装 (その他の関連するサービス) は に依存できますITenantContext。コントローラーは、テナントについて知る必要はありません。

于 2010-05-03T03:30:35.217 に答える
1

@FreshCode、コントローラーで直接リポジトリに依存しているかどうか、またはコントローラーがサービスに依存しており、サービスがリポジトリに依存しているかどうかはわかりません。ただし、コントローラーが structuremap によってインスタンス化される場合、サービスまたはリポジトリは既にインスタンス化されている必要があります。Begin_Request でテナントを決定し、Inject メソッドを使用して、インスタンス化されたコンテキストを構造マップに挿入します。これはコントローラ ファクトリより前に実行されるため、コントローラがインスタンス化されると、すべての依存関係が既に作成されています。

よろしく。

于 2010-05-01T15:15:56.377 に答える