【问题标题】:NServiceBus Unit of Work For Multitenancy with Custom ORM具有自定义 ORM 的多租户 NServiceBus 工作单元
【发布时间】:2012-12-14 21:56:45
【问题描述】:

这是我的参数:

  • 使用默认构建器的简单 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 将跨消息重用线程。然后将使用相同的范围,如果消息用于不同的环境,则会导致问题。

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

我见过Unit Of Work Implementation for RavenDB,以及全双工示例中的工作单元实现,但我不确定这是正确的路径。

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

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

【问题讨论】:

    标签: multithreading orm nservicebus multi-tenant unit-of-work


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多