0

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

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

当用户进行身份验证时,我解析适当的数据库标识符,将其存储在会话管理器中。对 Web API 层的每个调用都会传入一个会话 ID,该会话 ID 在后端解析数据库 ID,然后将其用于传入每个门面/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 是该特定用户所属的特定租户的标识符。

4

1 回答 1

0

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

于 2013-05-19T09:32:55.837 回答