0

通常我会创建 1 个实现 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<MySagaData>),我们称之为 MyClass2。

如果我像下面这样实现 MyClass2: public class MyClass2 : Saga<MySagaData> { ……… }

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

4

1 回答 1

2

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

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

此外,这样做会将 sagas 耦合在一起。您将无法在不影响另一个的情况下向其中添加内容。这是一个在DRY之前应用SRP(单一责任原则)的好地方(不要重复我们自己)。

为了更容易地创建 saga 数据类,您可以从ContainSagaData其中继承已经需要的三个属性IContainSagaData。这在 NServiceBus 的几个版本之前效果不佳(例如,由于继承,NHibernate 持久性会创建太多表),但这些问题在最近版本的 NServiceBus 中得到了解决。

于 2015-11-12T17:29:01.647 回答