Mi piace implementare classi di servizio come stateless. Tuttavia, mi piace anche scomporre la mia logica in più, semplici metodi o funzioni. In alcuni scenari sembra che i due siano un po 'l'uno contro l'altro. Considera i seguenti due esempi.
Ho un oggetto entità chiamato House
, implementato qualcosa di simile.
public class House {
public string Address { get; set; }
public List<Room> Rooms { get; set; }
...
public IEnumerable<Furniture> GetAllFurnitures() {
return Rooms.SelectMany(e => e.Furnitures);
}
...
}
1. Implementazione stateful
Pro: codice più pulito, nessun parametro infernale
Contro: un servizio per uno House
, rende più difficile l'iniezione della dipendenza a causa del parametro costruttore
public class HouseCleaner {
private readonly House _house;
public HouseCleaner(House house) {
_house = house;
}
public void Clean() {
vacuumClean();
cleanBathroom();
cleanToilettes();
cleanKitchen();
wipeFloor();
}
}
2. Implementazione senza stato
Vantaggi: l'istanza del servizio può essere condivisa, facilita l'immissione delle dipendenze
Contro: è necessario passare probabilmente molti parametri a tutti i metodi e le funzioni semplici per condividere lo stato corrente
public class HouseCleaner {
public void Clean(House house) {
vacuumClean(house);
cleanBathroom(house);
cleanToilettes(house);
cleanKitchen(house);
wipeFloor(house);
}
}
Quale ti senti più appropriato considerando che questo è un esempio semplificato. In realtà potrebbero esserci diverse dipendenze del servizio e anche altri parametri.