gpt4 book ai didi

caSTLe-windsor - 在 NServiceBus 下管理 Windsor 中的 RavenDb session

转载 作者:行者123 更新时间:2023-12-03 22:42:52 35 4
gpt4 key购买 nike

我在 MVC 4 项目中使用 NServiceBus (3.2.2)、RavenDB (1.2.2017-Unstable) 和 Windsor (3.0.0.4001)。

我有一个处理 3 种不同消息的 IHandleMessages 类,它需要一个 IDocumentSession,因此定义了一个属性,例如:

public IDocumentSession DocumentSession { get; set; }

我已经从 NServiceBus 复制了 RavenDbUnitOfWork 实现 website

我已经在我的 Windsor 容器中注册了 IDocumentStore、IDocumentSession 和 IManageUnitsOfWork,如下所示:
container.Register(
Component
.For<IManageUnitsOfWork>()
.ImplementedBy<RavenUnitOfWork>()
.LifestyleTransient()
);
container.Register(
Component
.For<IDocumentStore>()
.UsingFactoryMethod(k => DocumentStoreHolder.DocumentStore)
.LifestyleSingleton(),
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleTransient()
);

NServiceBus 配置为使用我的容器:
Configure.With()
.CastleWindsorBuilder(container);

我遇到了 UnitOfWork 和消息处理程序接收 DocumentSession 的不同实例的问题。这意味着不会保存消息处理程序中 session 中存储的对象,因为 SaveChanges() 是在不同的 DocumentSession 上调用的。

删除 Transient 生活方式会导致不同类型的问题,导致从 RavenDb 更新对象时出现并发/冲突,因为(可能)消息处理程序不断获取 DocumentSession 的相同实例,该实例保存更新对象的缓存版本。

更新:

按照建议,我尝试将温莎中 IDocumentSession 的注册更改为 Scope 生活方式,如下所示:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()

当容器尝试解析 MVC Controller 时,这会导致异常,说未找到范围,并询问我是否忘记调用 BeginScope()。

最佳答案

您需要有 Per Message 的范围,而不是 transient 或单例。

关于caSTLe-windsor - 在 NServiceBus 下管理 Windsor 中的 RavenDb session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11774386/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com