Ninject:通过绑定将对象向下传递给多租户

时间:2012-01-27 20:46:32

标签: asp.net-mvc ninject

我在Asp.NET MVC中有一个使用Ninject和Fluent nHibernate的多租户应用程序。我每个租户都有一个数据库,我为每个租户创建了一个会话工厂。

现在在租户登录后,我需要(如果它不存在)创建一个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?

1 个答案:

答案 0 :(得分:0)

在请求范围中注册您的TenantInfo类型。可以使用ToMethod通过cookie在您的问题中创建此TenantInfo。

然后将ISession绑定到ninject提供程序(继承自Provider的类)。使此提供程序作为TenantInfo的构造函数参数(或属性)。在提供程序中,您可以获得构建会话所需的信息。对于租户。