2017-10-16 4 views
2

Je teste mes gestionnaires de commandes en quelque sorte comme ceci:Comment résoudre l'incompatibilité de InMemoryEventStore et PdoEventStore dans Prooph?

public function testHandle_ShouldPublishFooEvent(): void 
{ 
    $fooCommand = $this->givenFooCommand(); 

    $this->whenHandleCommand($fooCommand); 

    $this->thenFooEventIsPublished(); 
} 

Fondamentalement, je teste le scénario seulement heureux quand il n'y a pas de logique de validation dans le gestionnaire de commandes. Je l'ai testé en vérifiant que l'événement attendu a été publié dans le bus d'événements. Avant d'envoyer la commande tester dans le bus de commande dans la méthode whenHandleCommand, je commence l'enregistrement a envoyé des événements, quelque chose comme:

$eventBus->attach(
    EventBus::EVENT_DISPATCH, 
    function (ActionEvent $actionEvent) use ($events): void { 
     $event = $actionEvent->getParam(MessageBus::EVENT_PARAM_MESSAGE); 
     $events->addEvent($event); 
    }, 
    -1000 
); 

et à la fin je viens de vérifier les événements enregistrés et affirme que c'est ce que j'attendais. Mais j'ai un problème avec la commutation entre MysqlEventStore et InMemoryEventStore, parce que MysqlEventStore n'est pas transactionnel (et donc émettant des événements dans la méthode saveAggregateRoot), au lieu de InMemoryEventStore qui est transactionnel (et donc d'émettre des événements dans la méthode commit).

Mon dépôt méthode de sauvegarde est aussi simple que:

class ProophFooRepository extends AggregateRepository implements FooRepository 
{ 
    public function save(FooAggregate $foo): void 
    { 
     $this->saveAggregateRoot($foo); 
    } 
    ... 
} 

Comment faire pour que je puisse changer ce EventStore (mémoire ou DOP) Je veux utiliser et cela fonctionnera? Devrais-je avoir la condition if($this->isTransactionalEventStore()) (puis commencer la transaction et commettre) dans mon dépôt pour cela? Je n'aime pas ça. :(

Pourquoi il n'y a que InMemoryEventStore qui est transactionnelle devrait pas être préférable d'avoir à la fois InMemoryTransactionalEventStore et InMemoryEventStore Parce que je veux que mes tests obtenus avec InMemoryEventStore, alors que normalement j'utilise PdoEventStore

EDIT:?. Quand je change ligne 100 InMemoryEventStoreFactory à

$wrapper = new ActionEventEmitterEventStore($eventStore, $eventEmitter); 

et faire InMemoryEventStore outils EventStore au lieu de TransactionalEventStore, tout fonctionne très bien. donc, soit je suis en quelque sorte pas utilisé, ou il peut être fixé EASI correctement prooph et il n'est pas nécessaire lly par PR avec fractionnement ImMemoryEventStore à InMemoryTransactionalEventStore et InMemoryEventStore?

Répondre

1

C'est une question très valable. Le problème est que je n'ai pas pensé à ce cas d'utilisation lorsque je travaillais sur l'implémentation du magasin d'événements v7. Une solution de contournement consiste à envelopper avec le ActionEventEmitterEventStore, comme vous l'avez décrit. Un magasin d'événements de mémoire non transactionnel serait cependant la meilleure alternative (qui n'est pas présente à ce moment).

Actuellement InMemoryEventStore est transactionnel, donc supprimer cette fonctionnalité et la mettre dans TransactionalInMemoryEventStore serait une coupure BC, que nous ne pouvons pas faire sans une nouvelle version majeure. C'est pourquoi je pense que nous devrions créer une nouvelle implémentation appelée NonTransactionalInMemoryEventStore. J'ai créé un ticket ici: https://github.com/prooph/event-store/issues/307. Voulez-vous prendre le relais et fournir un PR?

+0

Bien sûr, regardera cela demain :) – Tom