我有一个多租户系统,每个租户共享相同的代码库实例,但有自己的数据库。
我正在使用 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 是该特定用户所属的特定租户的标识符。