私はNServiceBusのドキュメントを見て、複数のテナントをセットアップして各テナントの個々のデータベースにsagaデータを保存するサンプルを実行しました。NServiceBus v5マルチテナント佐賀の例をホステッドサービスとして設定できません
https://docs.particular.net/samples/outbox/multi-tenant/?version=core_5
私は現在、NServiceBus.Hostパッケージを使用してWindowsサービスとして実行されているNServiceBusのアプリケーションを持っています。いくつかのテナント間で単一のサガデータテーブルを共有しているため、ホストされるサンプルを簡単に変換できるようになるため、既存のプロジェクトをマルチテナントSQL接続に変換する必要があります。ただし、この例では、コンソールアプリケーションと手動で作成されたバスが使用されています。私は期待して私はEndpointConfig.csファイルが追加されたサンプルアプリケーションにNServiceBus.Host NuGetパッケージを追加しますが、私はパイプラインエグゼキュータと連携する方法を見つけ出すことができない場合
。
はProgram.csのでレシーバープロジェクトでは、これがあります:
internal static PipelineExecutor PipelineExecutor;
var busConfiguration = new BusConfiguration();
PipelineExecutor = ((UnicastBus) startableBus).Builder.Build<PipelineExecutor>();
しかし、あなたは明らかにEnpointConfig.csホストされているアプリケーションの内のことを行うことはできません。
次のあなたは、個々のクライアント接続がnext();
IncomingContext context
へのアクセス権を持っている
起動方法で
MultiTenantOpenSqlConnectionBehavior.csを表示する場合
class MultiTenantOpenSqlConnectionBehavior :
IBehavior<IncomingContext>
{
public void Invoke(IncomingContext context, Action next)
{
var defaultConnectionString = ConfigurationManager.ConnectionStrings["NServiceBus/Persistence"]
.ConnectionString;
#region OpenTenantDatabaseConnection
string tenant;
if (!context.PhysicalMessage.Headers.TryGetValue("TenantId", out tenant))
{
throw new InvalidOperationException("No tenant id");
}
var connectionString = ConfigurationManager.ConnectionStrings[tenant]
.ConnectionString;
var lazyConnection = new Lazy<IDbConnection>(() =>
{
var connection = new SqlConnection(connectionString);
connection.Open();
return connection;
});
var key = $"LazySqlConnection-{defaultConnectionString}";
context.Set(key, lazyConnection);
try
{
next();
}
finally
{
if (lazyConnection.IsValueCreated)
{
lazyConnection.Value.Dispose();
}
context.Remove(key);
}
#endregion
}
}
そしてMultiTenantConnectionProvider.csにおいて、上記宣言静的PipelineExecutorが参照されているとコンテキストでは、上記のクラスで設定された同じキーを使用して接続を取得できます。
class MultiTenantConnectionProvider :
DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
var defaultConnectionString = ConfigurationManager.ConnectionStrings["NServiceBus/Persistence"]
.ConnectionString;
#region GetConnectionFromContext
Lazy<IDbConnection> lazy;
//
// This line is the problem. The static Program.PipelineExecutor is accessed
//
var pipelineExecutor = Program.PipelineExecutor;
var key = $"LazySqlConnection-{defaultConnectionString}";
if (
pipelineExecutor != null &&
pipelineExecutor.CurrentContext.TryGet(key, out lazy))
{
var connection = Driver.CreateConnection();
connection.ConnectionString = lazy.Value.ConnectionString;
connection.Open();
return connection;
}
return base.GetConnection();
#endregion
}
}
は確かにホストされたアプリケーションでこれを行う方法がなければならないが、私はこれを行う方法上の任意の情報を見つけることができません。
あなたはNServiceBusバージョン5.xでこれを行うために探していますか? –
はい、バージョン5.xです。 –