多租户/共享应用系统,如何维护多个特定于租户的标识符?

时间:2012-12-29 11:08:01

标签: ravendb multi-tenant

我有一个多租户系统,每个租户共享同一个代码库实例,但拥有自己的数据库。

我正在使用RavenDB进行持久化,使用Asp.net WebAPI封装的标准c#facade / BLL后端,我发现在触及数据库的每个较低级别操作(深入我的业务逻辑类)中,我需要传入一个标识符,以便我的RavenDb客户端会话知道要操作哪个数据库。

当用户进行身份验证时,我会解析相应的数据库标识,并将其存储在会话管理器中。每次针对Web API层的调用都会传入会话ID,该会话ID解析后端中的数据库ID,然后将其用于传递到每个Facade / BLL调用中。

我的所有依赖项都是通过WebAPI级别的IoC容器处理的,但我无法在此阶段传入数据库ID,因为对于每个登录的用户来说,它可能不同。

这当然变得单调乏味。

有人可以给我一些指导,说明我可以做些什么来缓解这个问题?也许是某种政策注入/ AOP解决方案?

我的后端代码的粗略示例看起来像..

public class WidgetService()
{
     private WidgetBLL _widgetBLL;
     private ISessionManager _sessionManager;

     public WidgetService(WidgetBLL _widgetBLL, ISessionManager sessionManager)
     {
          _widgetBLL = widgetBLL;
          _sessionManager = sessionManager
     }

     public Widget getWidget(string sessionId, string widgetId)
     {
          string DbId = sessionManager.ResolveDbId(sessionId)
          return _widgetBLL.GetWidget(string dbId, string widgetId);
     }
}



public class WidgetManager()
{
    public GetWidget(string dbId, string widgetId)
    {
          using (IDocumentSession session = documentStore.OpenSession(dbId) 
          {
             var widget = session.load<Widget>(widgetid);
          }
          return widget;
    }
}

DBID是此特定用户所属的特定租户的标识符。

1 个答案:

答案 0 :(得分:0)

您需要更改使用会话的方式。 不要自己打开和关闭会话,而是在IoC代码中执行此操作。 然后传递已为正确的数据库打开的会话。