Ho difficoltà a trovare un buon modo per strutturare le interfacce per due moduli che sono logicamente indipendenti ma le cui implementazioni possono essere combinate ai fini delle prestazioni o dell'efficienza.
La mia situazione specifica è la sostituzione dei moduli di accodamento e registrazione separati in un'applicazione di instradamento dei messaggi con un'implementazione combinata supportata da database (chiamiamola DbQueueLog
). È abbastanza facile per DbQueueLog
implementare entrambe le interfacce IQueue
e ILogger
in modo che i client dei vecchi moduli di accodamento e registrazione possano utilizzarlo senza problemi. La sfida è che l'implementazione più efficiente e performante di DbQueueLog
comporta la combinazione dei metodi EnqueueMessage(Message m)
e LogMessage(Message m, List<LogParams> p)
in un metodo EnqueueAndLogMessage(Message m, List<LogParams> p)
che riduce al minimo il numero di chiamate database cross-process e la quantità di dati scritti sul disco. Potrei creare una nuova interfaccia IQueueLog
con questi nuovi metodi, ma non mi sento a mio agio con cosa significherebbe se una futura iterazione dell'applicazione tornasse a moduli di accodamento e registrazione separati.
Esistono approcci progettuali a questa situazione che mi permettano di costruire un'implementazione efficiente, performante DbQueueLog
ora senza dover accoppiare in modo permanente i moduli di accodamento e registrazione dell'applicazione?
Modifica: l'applicazione è costruita su Windows utilizzando C # nel caso in cui vi siano tecniche specifiche della piattaforma che potrebbero essere disponibili.