2012-01-27 54 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的构造函数参数(或属性)。在提供者内部,您将获得构建会话的必要信息。为租客。