Suggerirei di separare il modulo della business logic dal modulo di comunicazione.
Il modulo della business logic coprirebbe l'elaborazione dei dati e avrebbe qualche interfaccia con il modulo di logica di comunicazione.
Il modulo di comunicazione si occuperebbe esclusivamente di ricevere e inviare i messaggi, senza alcuna elaborazione dei dati, oltre alla convalida dei dati di base. Il modulo di comunicazione implementerebbe Pattern di strategia , in cui il modulo della logica di business invocherà un'interfaccia esposta del modulo di comunicazione, che, in turn avrebbe due implementazioni: una con RabbitMq e l'altra con Kafka.
Supponendo che la tua applicazione abbia la stessa logica aziendale, indipendentemente dal fatto che tu usi RabbitMq o Kafka (altrimenti non faresti questa domanda), dovresti astrarre quella logica aziendale, non i gestori di eventi di per sé.
Diciamo che Rabbit Mq ha un gestore di eventi ShutDown, e Kafka ha qualcosa chiamato Stop event handler (probabilmente non lo fa, ma per il gusto dell'argomento). Questa funzionalità verrebbe estratta tramite l'interfaccia ICommunication
(ad esempio), utilizzando il metodo StopWorking
. Quindi, RabbitMq lo implementerebbe usando ShutDown, e Kafka lo implementerebbe usando Stop. Il modulo logico aziendale vedrebbe ICommunication.StopWorking
. Qualunque cosa accada al di là di questo non gli interessa e viene separata da quella parte.