NServiceBus — 2 класса, использующие одну и ту же сагу, возможно ли это?

Обычно я создаю 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 следующим образом: открытый класс MyClass2 : Saga‹MySagaData› { ……… }

будут ли свойства ACID Saga‹MySagaData› присутствовать для MyClass1 и MyClass2, как если бы Saga‹MySagaData› просто использовалась в 1 классе? И в свойствах ACID я включаю, например, откат обработчика сообщений и повторную попытку в MyClass1, если другой обработчик сообщений для другого класса (MyClass2) только что зафиксировал изменения в MySagaData?


person Miguel    schedule 12.11.2015    source источник
comment
Я изо всех сил пытаюсь понять, почему вам нужно использовать Saga‹MySagaData› в другом классе? Не могли бы вы немного уточнить?   -  person David Boike    schedule 12.11.2015
comment
Так должен ли я просто использовать другую независимую сагу?   -  person Miguel    schedule 12.11.2015
comment
Да. Хотя вы можете наследовать MySagaData от ContainSagaData (в последних версиях NServiceBus), чтобы не создавать свойства Id, Originator и OriginalMessageId.   -  person David Boike    schedule 12.11.2015


Ответы (1)


Похоже, вы пытаетесь повторно использовать класс данных саги между двумя сагами. Это не очень хорошая идея.

Каждая сага должна быть логически независимой. Если вы используете один и тот же класс для данных саги, различные механизмы сохраняемости, используемые NServiceBus, будут хранить их вместе, и есть большая вероятность, что провода могут пересечься, что приведет к неправильным данным в неправильной саге.

Кроме того, это соединило бы саги вместе. Вы не сможете добавить что-то к одному, не повлияв на другое. Это хорошее место для применения SRP (Sединственный Rпринцип ответственности), намного опережающий DRY (D не повторяйте себя).

Чтобы упростить создание классов данных саги, вы можете наследовать от ContainSagaData, у которого уже есть три свойства, требуемые IContainSagaData. Несколько версий NServiceBus назад это не работало (например, постоянство NHibernate создавало слишком много таблиц из-за наследования), но эти проблемы решены в последних версиях NServiceBus.

person David Boike    schedule 12.11.2015