各テナントがコードベースの同じインスタンスを共有するマルチテナント システムを使用していますが、独自のデータベースがあります。
Asp.net WebAPI でラップされた標準の c# ファサード/BLL バックエンドを使用して、永続性のために RavenDB を使用しています。データベースに触れるすべての下位レベルの操作 (ビジネス ロジック クラスの奥深く) で、必要があることがわかりました。私のRavenDbクライアントセッションが操作対象のデータベースを認識できるように、識別子を渡します。
ユーザーが認証されると、適切なデータベース識別子が解決され、セッション マネージャーに保存されます。Web API レイヤーに対するすべての呼び出しは、バックエンドでデータベース 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 は、この特定のユーザーがメンバーである特定のテナントの識別子です。