2

私は IoC コンテナーに比較的慣れていないため、無知であることをあらかじめお詫びします。

私のアプリケーションは、Entity Framework とその上にあるリポジトリ レイヤーを使用する asp.net 4.0 MVC アプリです。これはマルチテナント アプリケーションであるため、使用される接続文字列はログインしているクライアントによって異なります。

接続文字列は、クライアントを示すルートの一部として渡される「キー」によって決定されます。このルート データは、ユーザーのセッションの最初の要求にのみ存在します。

ルートは次のようになります: http://{host}/login/dev/

「dev」は、dev データベースを使用していることを示します。

現在、IoC コンテナーはすべての依存関係を global.asax Application_Start イベント ハンドラーに登録しており、次のように「キー」をハードコーディングしています。

var cnString = CommonServices.GetDBConnection("dev");
container.RegisterType<IRequestMgmtRecipientRepository, RequestMgmtRecipientRepository>(
        new InjectionConstructor(cnString));

最初に提供されたルート データを使用して、ログインしたクライアントに基づいてリポジトリを動的に登録する Unity の方法はありますか?

注: リポジトリを手動で解決しているわけではありません。コントローラーがインスタンス化されると、コンテナーによって構築されます。私は困惑しています。

ありがとう!

4

1 に答える 1

0

簡単に仮定すると、ホストを使用してテナントを識別できます。

次の記事には、わずかに異なるアプローチがあります http://www.agileatwork.com/bolt-on-multi-tenancy-in-asp-net-mvc-with-unity-and-nhibernate-part-ii-commingled-data/、NHを使用していますが、使用できます。

上記に基づいて、このハッキングされたコードは機能する可能性があります(以下を試したり準拠したりしていません。ユニティユーザーではなく、ウィンザーの人です:))

Container.RegisterType<IRequestMgmtRecipientRepository, RequestMgmtRecipientRepository>(new InjectionFactory(c =>
{
    //the following you can get via a static class
    //HttpContext.Current.Request.Url.Host, if i remember correctly
    var context = c.Resolve<HttpContextBase>();
    var host = context.Request.Headers["Host"] ?? context.Request.Url.Host;

    var connStr = CommonServices.GetDBConnection("dev_" + host); //assumed
    return new RequestMgmtRecipientRepository(connStr);
}));

シナリオ 2 (これは事実ではないと思います)

クライアントが (ホストではなく、http://host1 などの) テナントを識別している場合、これは、クライアント情報にアクセスするためにデータベースへのアクセスが既に必要であることを示唆していますか? この場合、クライアント情報を保持するデータベースには、テナントを識別するのに十分な情報も必要です。

シナリオ 2 の問題は、テナントがアクセスされている anon の使用に関して発生します。

シナリオ 2 を想定すると、InjectionFactory は引き続き機能するはずです。

お役に立てれば

于 2013-07-22T03:35:44.173 に答える