3

最後に、NHibernate を利用したドメイン モデルでマルチテナント機能の透過的で流暢なサポートを実装するための最良の戦略は何かを説明してもらえますか?

TenantID によるフィルタリングなど、マルチテナントのものからドメイン ロジックを可能な限り分離する方法を探しています。

4

6 に答える 6

2

最も簡単な方法は、クライアントごとに異なるデータベースを使用することです。

この方法でマルチテナントを実装すると、シングル テナント アプリケーションを効果的に作成し、セッションを作成/取得する時点でマルチテナントについてのみ心配することができます。

詳細についてはまだ深く掘り下げていませんが (数か月以内に同様のことを行う必要があります)、セッションが接続されているデータベースを管理する最も簡単な方法は、どの接続を決定できるカスタム ISessionFactory 実装を使用することだと思います使用する (リクエスト URL のホスト部分などの外部側面に基づく)。

これについて議論しているネット上の投稿を少なくとも 1 つ見たことがありますが、現時点ではリンクが見つかりません。

Castle Windsor を使用している場合は、NHibernate 統合機能を参照してください。これは、複数の (名前付き) セッション ファクトリの概念をサポートし、クライアントごとにセッション ファクトリを持つことができます。統合機能は、名前付きセッション ファクトリでセッションを開くことができる ISessionManager インターフェイスを提供します (また、Web アプリケーションの要求ごとのセッション セマンティクスを提供します)。セッションへのアクセスを必要とするものは、単純に ISession コンストラクター パラメーターを受け取ることができ、ISessionManager をコンストラクター パラメーターとして受け取るファクトリを作成できます。次に、ファクトリは、リクエストを調べて、どの名前付きセッション ファクトリを使用する必要があるかを判断することにより、適切な名前付きセッション ファクトリでセッションを開くことができます。

于 2008-10-30T02:12:03.927 に答える
1

私はここでマルチテナンシーのアプローチをブログしました。このアプローチはすべての状況に理想的ではありませんが、サードパーティ製品を使用しなくてもマルチテナンシーの問題をほとんど忘れることができます。

于 2010-04-06T13:46:30.183 に答える
1

私も最近、次のプロジェクトのためにそれを掘り下げています。カスタム IConnectionProvider を実装し、「connection.provider」を使用して構成に登録できます。

完全にカスタムのものを実装するのではなく、DriverConnectionProvider から派生させて ConnectionString をオーバーライドすることをお勧めします。

次のようなものです。

    public class ContextualConnectionProvider : DriverConnectionProvider
    {

        protected override string ConnectionString
        {
            get
            {
                return GetCurrentTenantDatabaseConnectionStringInternally();
            }
        }

        public override void Configure(IDictionary<string, string> settings)
        {
            ConfigureDriver(settings);
        }

    }

お役に立てれば。

于 2008-10-30T10:02:28.110 に答える
1

それを実現する方法はさまざまありますが、マルチテナンシーの問題はデータ モデルだけにとどまりません。私は製品をプラグインするのは嫌いですが、私が働いている会社である Apprenda の SaaSGrid をチェックしてください。アプリへのマルチテナンシー。アプリを公開するときに、データ モデル (分離データベースまたは共有) を選択するなどの操作を行うことができます。それに応じて SaaSGrid がデプロイされ、コードを変更することなくアプリが実行されます。単一テナント用の場合と同じようにコードを記述するだけです。

于 2008-12-04T21:45:50.913 に答える
0

共有スキーマアプローチを使用するには、すべてのクエリをインターセプトして、結果を制限するための追加情報で装飾する必要があります。

NHibernateはこれを行うためのインターセプターを提供し、イベントリスナーはNHibernate 2.0Aplpha1からも利用できます。

に関する議論については、http ://elegantcode.com/2008/05/15/implementing-nhibernate-interceptors/およびhttp://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.htmlを参照してください。これらは。

また、AyendeのRhino Securityコンポーネントを見てください。彼は、セキュリティ記述子に基づいて追加の制限を加えてクエリを変更するために多くの作業を行っています。ソースはhttps://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/securityで参照できます。

于 2009-07-20T21:16:07.157 に答える
0

Ayendeには、マルチテナンシー アプリの構築に関する優れたブログ記事があります。NHibernate をどのように使用するかは、目的のマルチテナンシーのタイプによって異なります。

于 2008-09-18T11:55:24.747 に答える