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



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

我使用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是该特定用户所属的特定租户的标识符。

您需要更改使用会话的方式。而不是自己打开和关闭会话,在IoC代码中这样做。然后传递一个已经为正确的db打开的会话

最新更新