Concurrency NServiceBus-2类使用相同的传奇,这可能吗?

Concurrency NServiceBus-2类使用相同的传奇,这可能吗?,concurrency,nservicebus,saga,Concurrency,Nservicebus,Saga,通常我会创建一个实现Saga的类: 现在我需要在另一个类中使用相同的Saga(Saga),我们称之为MyClass2 如果我实现MyClass2,如下所示: 公共类MyClass2:传奇 { ……… } Saga的酸性特性是否会出现在MyClass1和MyClass2中,就好像Saga只在1类中使用一样?在我包含的ACID属性中,例如回滚一个消息处理程序并在MyClass1中重试,如果另一个类(MyClass2)的另一个消息处理程序刚刚提交了对MySagaData的更改?看起来您正试图在两个sa

通常我会创建一个实现Saga的类:

现在我需要在另一个类中使用相同的Saga(Saga),我们称之为MyClass2

如果我实现MyClass2,如下所示: 公共类MyClass2:传奇 { ……… }


Saga的酸性特性是否会出现在MyClass1和MyClass2中,就好像Saga只在1类中使用一样?在我包含的ACID属性中,例如回滚一个消息处理程序并在MyClass1中重试,如果另一个类(MyClass2)的另一个消息处理程序刚刚提交了对MySagaData的更改?

看起来您正试图在两个saga之间重用saga数据类。这不是一个好主意

每个传奇故事在逻辑上应该是独立的。如果您对saga数据使用同一个类,NServiceBus使用的各种持久性机制将它们存储在一起,很有可能这些连接会交叉,从而导致错误saga中的错误数据

此外,这样做将把传奇故事结合在一起。你不可能在不影响另一个的情况下向其中添加内容。这是一个应用SRP(SsingleRresponsibilityPprinciple)的好地方,远远领先于干燥(Don'tRepeatY我们自己)


为了更容易地创建saga数据类,您可以从
ContainSagaData
继承,它已经具有
IContainSagaData
所需的三个属性。这在以前的几个版本的NServiceBus中都不起作用(例如,NHibernate持久化会因为继承而创建太多的表),但这些问题在最近的NServiceBus版本中得到了解决。

我很难理解为什么需要在另一个类中使用Saga?你能详细说明一下吗?那么我应该用另一个独立的故事吗?是的。尽管您可以从ContainSagaData(在最新版本的NServiceBus中)继承MySagaData,以避免创建Id、原始发件人和原始消息Id属性。
public class MyClass1 : Saga<MySagaData>;
{
            ………
}
[SagaIndex("ExternalCombinedIdentifier")]
[SagaIndex("MyOwnId")]
public class MySagaData: IContainSagaData
{
    public MySagaData()
    {
                            ……

    }


    public Guid Id { get; set; }
    public string Originator { get; set; }
    public string OriginalMessageId { get; set; }
    ……

}