0

各テナントがコードベースの同じインスタンスを共有するマルチテナント システムを使用していますが、独自のデータベースがあります。

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 は、この特定のユーザーがメンバーである特定のテナントの識別子です。

4

1 に答える 1

0

セッションの使用方法を変更する必要があります。自分でセッションを開いたり閉じたりする代わりに、IoC コードでそれを行います。次に、適切なデータベースに対して既に開かれているセッションを渡します。

于 2013-05-19T09:32:55.837 に答える