0

这是我的参数:

  • 使用默认构建器的简单 NServiceBus Saga 实现
  • 基于 SQL Server 的内部 ORM
  • 多租户 - 我有两个 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;
    };
  }
}

这在我们的单租户 Beta 环境中运行良好 - 可以重新使用该静态范围,因为环境标头对于给定的部署总是相同的。

据我了解,这不适用于上述多租户情况,因为 NServiceBus 将跨消息重用线程。然后将使用相同的范围,如果消息用于不同的环境,则会导致问题。

我想我想要的是每条消息有一个范围,但我真的不确定如何到达那里。

我已经看过RavenDB的工作单元实现,以及全双工示例中的工作单元实现,但我不确定这是正确的路径。

我也看到了 DependencyLifecycle 枚举,但我不确定如何使用它来解析范围,因为我必须设置 GetScope 函数。

显然我不知道这里发生了什么。有什么建议么?

4

1 回答 1

1

如果您需要在每条消息的基础上执行某些操作,请考虑使用消息修改器 (IMutateIncomingMessages) 以及具有某些线程静态状态的工作单元管理。

于 2012-12-14T13:56:45.877 回答