2012-01-27 5 views
2

NinjectおよびFluentのnHibernateを使用してAsp.NET MVCにマルチテナントアプリケーションを使用しています。テナントごとに1つのデータベースがあり、テナントごとに1つのセッションファクトリを作成します。Ninject:マルチテナントのためのバインドを介してオブジェクトをレイヤーに渡す

テナントのログイン後、私は(もし存在しなければ)SessionFactoryを作成し、そこからセッションを取得する必要があります。それは終わった。私の問題は、現在、特定のテナント情報はFormsAuthクッキーから抽出され、私はレイヤーをそれを渡す必要があるということです

...ここ

は私の層である: ウェブ サービス データ

とき私のコントローラはいくつかの情報にアクセスする必要があり、特定のインフォメーションサービスを使用してセッションファクトリから来たセッションを持つデータリポジトリにアクセスします。 Webレイヤー

 Bind<ISomeInfoService>().To<SomeInfoService>() 
      .InRequestScope(); 

public class SomeController : BaseController 
{ 
    ISomeInfoService someInfoService; 

    public SomeController(ISomeInfoService someInfoService) 
    { 
     this.someInfoService= someInfoService; 
    }... 

サービス層

 Bind<SessionFactoryFactory>().ToSelf() 
      .InSingletonScope(); 

     Bind<ISession>() 
      .ToMethod(ctx => ctx.Kernel.Get<SessionFactoryFactory>() 
       .Get(**[??TENANTINFOOBJECT??]**).OpenSession()) 
      .WhenParentNamed("TenantDB") 
      .InRequestScope(); 

     Bind<ISomeInfoRepository>() 
      .To<SomeInfoRepository>() 
      .InRequestScope() 
      .Named("TenantDB"); 

データ層

Ninjectでテナント情報をセッションファクトリに送信するにはどうすればよいですか? Webリクエストが行われると、クッキーからテナントIDを抽出し、必要なテナントオブジェクト(ID +接続文字列)を構築することができます。 Ninjectを使ってレイヤーをSessionFactoryFactoryに渡すにはどうしたらいいですか?

+0

MVCアプリケーションからNinjectコンテナにアクセスできますか? – Restuta

+0

私はそうしていますが、私はテストフレンドリーではないので、むしろそれを使用していません。バインディング用のNinjectModuleを除いて、データレイヤーはNinjectについて知りません。 – Nick

+0

正確には試験的ではないでしょうか? – Restuta

答えて

0

あなたのTenantInfoであるタイプをリクエストスコープに登録してください。このTenantInfoは、あなたの質問でやっているように、ToMethodを使ってクッキーから作成することができます。

次に、ninjectプロバイダ(プロバイダを継承するクラス)にバインドします。このプロバイダを、TenantInfoのコンストラクタ引数(またはプロパティ)として使用します。プロバイダ内には、セッションを構築するために必要な情報があります。テナントのために。

関連する問題