2012-01-27 50 views
2

我在Asp.NET MVC中有Ninject和Fluent nHibernate的多租戶應用程序。我爲每個租戶有一個數據庫,併爲每個租戶創建一個會話工廠。Ninject:通過多租戶綁定傳遞對象向下層

現在租戶登錄後,我需要(如果它不存在)創建一個SessionFactory並獲得一個會話。完成了。

我現在的問題是,承租人專用信息從FormsAuth cookie中抽取,我需要它向下傳遞層...

這裏是我的層: 網絡 服務 數據

當我的控制器需要訪問某些信息,他們使用特定的信息服務來訪問數據存儲庫,並從sessionfactory中獲取一個會話。

數據層

 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"); 

服務層

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

網絡層

public class SomeController : BaseController 
{ 
    ISomeInfoService someInfoService; 

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

如何使用Ninject向我的sessionfactory發送租戶信息?當發出Web請求時,我從Cookie中提取租戶ID,並可以構建所需的租戶對象(id +連接字符串)。我如何使用Ninject將它傳遞給我的SessionFactoryFactory?

+0

您是否有權訪問您的MVC應用程序中的Ninject容器? – Restuta 2012-01-27 21:04:07

+0

我這樣做,但我寧願不使用它,因爲這不會測試友好。除了綁定的NinjectModule之外,數據層並不知道Ninject。 – Nick 2012-01-27 21:23:02

+0

究竟什麼不會測試友好? – Restuta 2012-01-27 21:25:46

回答

0

在請求範圍內註冊一個類型,即您的TenantInfo。這個TenantInfo可以使用ToMethod從cookies中創建,就像您在問題中所做的那樣。

然後將ISession綁定到ninject提供程序(從提供程序繼承的類)。使此提供者作爲TenantInfo的構造函數參數(或屬性)。在提供者內部,您將獲得構建會話的必要信息。爲租客。