NServiceBus - 2个类使用相同的Saga,这可能吗?

时间:2015-11-12 12:58:55

标签: concurrency nservicebus saga

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

public class MyClass1 : Saga<MySagaData>;
{
            ………
}

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; }
    ……

}

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

如果我实现MyClass2,如下所示:     公共类MyClass2:Saga&lt; MySagaData&gt;     {                 .........     }

将Saga的ACID属性&lt; MySagaData&gt;出现在MyClass1和MyClass2中,好像Saga&lt; MySagaData&gt;只会在一堂课中使用?在ACID属性中,我包括例如回滚消息处理程序并在MyClass1中重试它,如果另一个类的另一个消息处理程序(MyClass2)刚刚提交更改为MySagaData?

1 个答案:

答案 0 :(得分:2)

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

每个传奇应该在逻辑上独立。如果对saga数据使用相同的类,NServiceBus使用的各种持久性机制会将它们存储在一起,并且线路很可能会交叉,从而导致错误的传奇中的错误数据。

此外,这样做会将传奇结合在一起。你不能在不影响另一个的情况下添加东西。这是在DRY之前应用SRP( S ingle R 责任 P 原则)的好地方( D R 重复 Y 我们自己。)

为了更容易创建saga数据类,您可以从ContainSagaData继承,该IContainSagaData已具有 output$transtable = DT::renderDataTable( lastTransToMat, server = F, selection = list(target = 'cell') ) 所需的三个属性。这在NServiceBus的几个版本之前没有用(例如,由于继承,NHibernate持久性会创建太多的表)但是这些问题在NServiceBus的最新版本中得到了解决。