2017-02-02 30 views
0

У меня есть этот код класса Saga ниже, и часть вопроса прокомментирована внутри кода. Имейте в виду упрощение кода, поскольку я удаляю вездесущие языки и другие детали, чтобы было легко читать.Использование Bus.Send() и использование API-сервисов внутри обработчика Saga

public class MessageSaga : Saga, 
    IPointBy<SendMessageCommand>, IHandle<RequestProcessingCommand> 
{ 
    private readonly IServices _services; 

    public MessageSaga(IServices services, 
     IBus bus, IEventStore eventStore, IRepository repository) 
     : base(bus, eventStore, repository) 
    { 
     _services = services; 
    } 

    public void Handle(SendMessageCommand message) 
    { 
     var msg = MessageAggregate.CreateNew(message.Id, message.Text); 
     Repository.Save(msg); 

     // This is my Question #1 
     var request = new RequestProcessingCommand(message.Id, message.Text); 
     Bus.Send(request); 
    } 

    public void Handle(RequestProcessingCommand message) 
    { 
     var item = Repository.GetById<MessageAggregate>(message.Id); 

     // This is my Question #2 
     var result = _services.ProcessMessage(message.Text); 
     var response = ProcessItem.Generate(item, result); 
     Repository.Save(reponse); 
    } 
} 

Так, в приведенном выше коде, у меня есть два вопроса:

В вопросе № 1, так как «Автобус» доступен в классе Saga, это правильный способ использования Bus.Send() для ссылки на другой обработчик, или я должен сделать это внутри класса Aggregate?

Как и в вопросе номер два, у меня есть этот API-интерфейс «_services» вне домена, это правильный способ использовать его внутри обработчика, или я должен делать это внутри классов агрегатов.

Все мои коды отлично работают, и я даже загружаю тест без каких-либо проблем. Так или иначе, я чувствую сомнение, поскольку обработчик полагает, что это простое сохранение событий. Благодарю.

ответ

0

Моя рекомендация состояла в том, чтобы сохранить инфраструктурные проблемы за пределами вашей модели домена (агрегаты). Подумайте, onion architecture. Основное понятие заключается в том, что модель api создает границу между моделью и контекстом, в котором она работает.

Рассмотрите: если вы начинаете вводить шину или _сервис в свою модель домена, любое тестирование вашей логики домена требует проверки удвоения, что вы не обязательно заботитесь о том, когда пытаетесь оценить свою бизнес-логику.