CQRS con metodi secondari che vengono utilizzati in più di una posizione

2

Ho una situazione in cui alcuni comandi utilizzano alcuni metodi comuni. Questi sono stati originariamente sviluppati in un unico comando e ora sono utili per altri comandi, possono essere statici e autonomi.

public Command1 : ICommand
{
   // does something specific to some records
   // tidying up fields before they go to the db
   public static void DoSomePreRecordManuipulation(List<record> records)
   {
      //
   }

   public static void DoSomeMoreCommonThings(List<record> records)
   {
      //
   }

   public void Execute()
   {   
       ...
       DoSomePreRecordManuipulation(someRecords);
       ...
       //SaveDbChanges();
   }
}

public command2 : ICommand
{

   public void Execute()
   {
       ...
       BlahCommand.DoSomePreRecordManuipulation(someRecords);
       ...
       SaveDbChanges();
   }
}

Come puoi vedere dall'esempio sopra, command2 chiama semplicemente il metodo statico da command1 . Tuttavia, supponiamo che ci siano altri metodi e alcuni altri comandi coinvolti.

Caveat : There is little chance of these being used many more times, but this might arise

Inoltre, questi metodi riguardano solo una mano piena di comandi e metodi comuni e sono nella loro sfera di influenza.

Quindi mi chiedo se dovrei.

  1. Inietta il comando principale in altri comandi per accedere a questi metodi
  2. Rendi statici i metodi e fai riferimento direttamente al comando per i suoi metodi statici
  3. crea una classe helper statica in modo che i metodi più comuni (se necessario di nuovo) siano più facili da trovare (e non vadano a fondo nelle profondità di CQRS)
  4. crea una classe base per incapsulare la logica (che diventerebbe un po 'ingestibile se è necessaria più composizione

I miei pensieri

  1. sembra un odore
  2. sembra difficile da trovare.
  3. sembra un po 'troppo categorizzato, è utile averli come aiuto, ma i loro valori sembrano limitati
  4. hrmm (forse)
posta TheGeneral 03.04.2018 - 06:30
fonte

1 risposta

5

Quello che hai qui è un problema di riutilizzo del codice.

I comandi CQRS dovrebbero essere semplici, immutabili, con comportamenti relativi ai propri dati. Il loro ruolo è quello di esprimere l'intento di fare qualcosa e di portare i dati necessari per farlo. Non sono librerie, helper e non servono come artefatti di riutilizzo del codice.

Le soluzioni che attribuiscono la responsabilità di riutilizzare il codice in un comando (1 e 2) non sono OK poiché interromperanno l'SRP applicato ai comandi. Se lo fai, i comandi avranno più di un motivo per cambiare.

La soluzione migliore sarebbe quella di estrapolare il comportamento comune nella sua classe e utilizzare tale classe laddove necessario. Per questo hai due opzioni:

  1. iniettare la classe nel comando; questo ha il vantaggio che il client del comando sa immediatamente quali sono le dipendenze del comando ma ha lo svantaggio di spostare l'onere della gestione delle dipendenze al client.

  2. usa metodi statici; questo ha il vantaggio che nasconde la dipendenza a un'altra classe, ma è più difficile da testare in isolamento; d'altra parte, chi prova il comando da solo? Ricorda che un comando non ha un comportamento complesso, solo una logica di convalida dei campi e forse un elenco mutabile alla conversione o all'ordinamento della lista immutabile.

Quale soluzione usare dipende da ogni caso d'uso, ma preferirei usare i metodi statici.

    
risposta data 03.04.2018 - 08:06
fonte

Leggi altre domande sui tag