我有一个多租户系统,每个租户共享同一个代码库实例,但拥有自己的数据库。
我正在使用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是此特定用户所属的特定租户的标识符。
答案 0 :(得分:0)
您需要更改使用会话的方式。 不要自己打开和关闭会话,而是在IoC代码中执行此操作。 然后传递已为正确的数据库打开的会话。