0

ここに私のパラメータがあります:

  • デフォルトのビルダーを使用した単純な NServiceBus Saga の実装
  • SQL Server 上の社内 ORM
  • マルチテナンシー - 同じ Web サイトで実行されている 2 つの ASP.NET MVC 4 ドメインがあり、それぞれに独自のデータベースがあります。

次のように静的メソッドを使用して ORM を構成します。

public class EndpointConfig: IConfigureThisEndpoint, IWantCustomInitialization {
  public void Init() {
    var bus = Configure.With()
      .AutofacBuilder()
      .UnicastBus().LoadMessageHandlers().DoNotAutoSubscribe()
      .XmlSerializer()
      .MsmqTransport().IsTransactional(true).PurgeOnStartup(false)
      .MsmqSubscriptionStorage()
      .Sagas().RavenSagaPersister().InstallRavenIfNeeded()
      .UseInMemoryTimeoutPersister()
      .CreateBus()
      .Start();

     SlenderConfiguration.Init(bus);
  }
}

public class SlenderCofnigruation {
  private static ORMScope scope { get; set; }

  public static void Init(IBus bus)
  {
    ORMConfig.GetScope = () =>
    {
       var environment = "dev";
       if (bus.CurrentMessageContext.Headers.ContainsKey("Environment"))
         environment = bus.CurrentMessageContext.Headers["Environment"];

       if (scope == null)
         scope = new SlenderScope(ConfigurationManager.ConnectionStrings[environment].ConnectionString);
      return scope;
    };
  }
}

これは、単一テナントのベータ環境では問題なく機能します。環境ヘッダーは特定の展開で常に同じであるため、その静的スコープを再利用しても問題ありません。

NServiceBus はメッセージ間でスレッドを再利用するため、これは上記のマルチテナントの状況では機能しないことを理解しています。その後、同じスコープが使用され、メッセージが別の環境を対象としている場合に問題が発生します。

私が欲しいと思うのは、メッセージごとに単一のスコープですが、そこに到達する方法が本当にわかりません。

Unit Of Work Implementation for RavenDBと、全二重サンプルの Unit of Work 実装を見てきましたが、それが正しい道かどうかはわかりません。

DependencyLifecycle enum も見ましたが、GetScope 関数を設定する必要がある方法を考えると、それを使用してスコープを解決する方法がわかりません。

明らかに、ここで何が起こっているのかわかりません。助言がありますか?

4

1 に答える 1

1

メッセージごとに何かを行う必要がある場合は、スレッド静的状態での作業単位の管理に加えて、メッセージ ミューテーター (IMutateIncomingMessages) の使用を検討してください。

于 2012-12-14T13:56:45.877 に答える