1

我是Castle Windsor和 Fluent NHibernate (AutoMapping) 的新手。
我目前正在处理多租户应用程序并有以下要求。

  1. 存储租户信息的主数据库
  2. 每个租户的数据库

我已经使用温莎城堡集成了持久性设施,并且能够访问主数据库。我被困在我想从主数据库获取租户的连接信息的地方,再次将此信息传递给持久性设施以构建新会话。因此,最终可以访问主数据库和特定于租户的数据库。

任何人都可以指导我如何进行此操作。

简而言之:
在用户登录时,我想验证用户并从主数据库中识别其租户数据库连接字符串,并使用此信息为特定于租户的数据库操作构建新会话。

4

1 回答 1

0

我将从 ISession 创建 2 个派生类:IMasterSession 和 ITenantSession。这使您可以轻松地从控制器或视图模型中引用任一数据库。

您将需要为您的主数据库和 1 为您的租户数据库的 ISessionFactory 进行两次注册。命名这些,以便您可以参考这些。

现在注册 IMasterSession 如下:

Component.For<ISession>().PerWebRequest().Named("masterSession").UsingFactoryMethod((k, m) =>
    {
        var masterFactory = k.Resolve<ISessionFactory>("masterSessionFactory");
        return masterFactory.OpenSession();
    }),
Component.For<object>().Forward<IMasterSession>().Proxy.MixIns(registration =>
    registration.Component("masterSession"))

会话工厂必须使用生活方式单例注册,因为您的应用程序中只需要一个。会话的生命周期取决于您正在制作的应用程序类型,可能是 PerWebRequest。

可能有更好的方法来做到这一点,我很想听听。

租户数据库的方法应该类似。但是,您要么需要使用采用 IDBConnection 的 OpenSession 重载,要么需要实现自定义连接提供程序。您可以在此处找到更多相关信息

我希望这有帮助。

亲切的问候,

马尔维恩。

于 2013-01-02T12:56:03.837 回答