Supposto che abbia un blocco di codice comune tra due controller in cui l'unica differenza è la classe concreta utilizzata dal blocco. Entrambi i cloni implementano un'interfaccia comune quindi sto usando un'interfaccia per interagire con l'oggetto.
Il blocco di codice è una serie di passaggi che interagiscono con le funzioni della classe concreta. La classe avvolge una libreria di terze parti e gestisce gli errori e i ritiri dalla terza parte libreria chiama api remote.
Credo che questi blocchi siano i principali di DRY, quindi cerco di rifattorizzarli dal controller. Il mio primo pensiero è di aggiungere un'altra funzione all'interfaccia e spostare il blocco su istanza di classe. Tuttavia questo è ancora in violazione di DRY.
Un'altra opzione è quella di spostarlo in una classe di utilità ed eseguire il blocco lì, ma questo non sembra il modo "pulito" per costruire questo.
So che questo blocco non appartiene al controller se deve duplicare lo stesso blocco con una piccola differenza. Questo dovrebbe essere spostato sul livello logistico di business? O c'è un modello di progettazione che può aiutare a risolvere questo invece di spostarlo in una classe di utilità?
Esempio aggiunto Supponiamo che abbia due controller che eseguono la stessa sequenza di passaggi ma differiscono solo dalla classe concreta necessaria.
class Controller1 {
IWrapper wrapper = Wrapper1();
public ActionResult DoSequence(){
wrapper.SetepOne();
wrapper.StepTwo();
wrapper.StepThree();
return View();
}
}
class Controller2 {
IWrapper wrapper = Wrapper2();
public ActionResult DoSequence(){
wrapper.SetepOne();
wrapper.StepTwo();
wrapper.StepThree();
return View();
}
}
Voglio spostare il blocco di codice,
wrapper.SetepOne();
wrapper.StepTwo();
wrapper.StepThree();
fuori dai controller quindi sarebbe qualcosa di simile,
class Controller1 {
IWrapper wrapper = Wrapper1();
public ActionResult DoSequence(){
<some class>.RunSequence(wrapper);
return View();
}
}
class Controller2 {
IWrapper wrapper = Wrapper2();
public ActionResult DoSequence(){
<some class>.RunSequence(wrapper);
return View();
}
}
class <Some Class>{
public void RunSequence(IWrapper wrapper)
{
wrapper.SetepOne();
wrapper.StepTwo();
wrapper.StepThree();
}
}
Mi chiedo se ci sia un modello di progettazione che potrebbe aiutare a costruire <Some Class>
o un modello architettonico che potrebbe aiutare a decidere dove dovrebbe andare quella classe.