2015-11-12 5 views
0

Обычно я создаю 1 класс, который реализует Saga <T>: кодNServiceBus - 2 класса Используя ту же сагу, возможно ли это?

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 (Сага <MySagaData>) в другом классе, назовем его MyClass2.

Если я реализую MyClass2 вроде следующего: класса MyClass2 общественности: Saga <MySagaData> { ......... }

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

+0

Я боюсь понять, почему вам нужно использовать Saga в другом классе? Не могли бы вы немного разобраться? –

+0

Должен ли я использовать другую независимую сагу? – Miguel

+0

Да. Хотя вы можете наследовать MySagaData из ContainSagaData (в последних версиях NServiceBus), чтобы избежать создания свойств Id, Originator и OriginalMessageId. –

ответ

2

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

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

Кроме того, это приведет к совместному использованию саг. Вы не сможете добавлять вещи к одному, не затрагивая другого. Это хорошее место, чтобы применить SRP (S Ingle R esponsibility P rinciple) далеко впереди DRY (D on't R EPEAT Y, себя).

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