Diciamo per esempio che sto sviluppando una classe immaginaria chiamata WidgetMaker
. Se la classe dipende a un certo punto dai dati di ricerca memorizzati in un database, è meglio progettare la classe con una dipendenza dai dati o da un servizio per recuperare i dati?
Ha più senso farlo?
public class WidgetMaker {
public WidgetMaker(LookupData lookupData) {
}
public Widget MakeWidget() {
if(lookupData.SomeField) {
return new Widget("blue");
}
else {
return new Widget("red");
}
}
}
-o questo -
public class WidgetMaker {
private readonly LookupDataRepo lookupRepo
private LookupData lookupData;
public WidgetMaker(LookupDataRepo lookupRepo) {
lookupRepo = lookupRepo;
}
public Widget MakeWidget() {
if(lookupData == null) {
lookupData = lookupRepo.GetLookupData();
}
if(lookupData.SomeField) {
return new Widget("blue");
}
else {
return new Widget("red");
}
}
}
Il primo modo sembra il design "giusto" perché stiamo iniettando ciò di cui la classe ha bisogno. Rende la classe più facile al test unitario. Altrimenti dobbiamo passare un falso deposito solo per testare la logica.
Sul rovescio della medaglia, sembra che stiamo spingendo il recupero dei dati da qualche altra parte, forse una classe WidgetMakerFactory
. Quindi qualunque classe abbia bisogno di una WidgetMaker
, otterrebbe invece la dipendenza da WidgetMakerFactory
che sembra che stiamo ripetendo lo stesso problema.
public class WidgetController : Controller {
private WidgetMakerFactory factory;
public WidgetController(WidgetMakerFactory factory) {
this.factory = factory;
}
public ActionResult Index() {
return View(factory.Create().MakeWidget())
}
}