通常我会创建一个实现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?
答案 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的最新版本中得到了解决。