这是我的参数:
- 使用默认构建器的简单 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 函数。
显然我不知道这里发生了什么。有什么建议么?