我在MVC 4项目中使用NServiceBus(3.2.2),RavenDB(2017年2月1日 - 不稳定)和温莎(3.0.0.4001)。
我有一个处理3个不同的消息的IHandleMessages类,这点需要一个IDocumentSession,因此一个属性定义如:
public IDocumentSession DocumentSession { get; set; }
我已经复制从NServiceBus'的RavenDbUnitOfWork实现网站
我已经注册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的不同实例的问题。 这意味着存储在消息处理程序中的会话对象不被保存,因为调用SaveChanges()被调用在不同DocumentSession。
卸下瞬态生活方式引起不同类型的问题,从RavenDb更新对象时,因为(可能)消息处理程序不断得到DocumentSession,其中包含更新的对象的缓存版本的同一个实例导致并发/冲突。
更新:
至于建议,我试图改变温莎IDocumentSession登记,到示波器的生活方式,就像这样:
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
这将导致异常时,容器尝试解析MVC控制器,称该范围没有被发现,并询问如果我忘了打电话给BeginScope()。