Sto facendo DI (iniezione manuale) nella mia applicazione. La mia (pseudo-) composizione root ha un aspetto simile al seguente:
var connectionSettings = new Settings(SqlParameters)
var dataLoader = new SqlDataLoader(connectionSettings)
var data = dataLoader.LoadData() //yuck
var someOtherDependency = new SomeClass(...)
... //a lot of other objects construction
var dataProcessor = new DataProcessor(data, someOtherDependency, ...)
dataProcessor.Process()
Non sono abbastanza contento del codice qui sopra. Era destinato a contenere solo la costruzione di un oggetto grafico ( new(...)
) ad eccezione della chiamata al metodo finale Process()
, ma sfortunatamente qualche altra logica (in particolare il caricamento dei dati e le condizioni condizionali) si infiltrava. Qual è il modello di progettazione corretto in questi casi ? Ho pensato di cambiare codice in DataProcessor da:
public class DataProcessor
{
public DataProcessor(Data data, otherDependency, ...)
{
this.data = data;
this.otherDependecy = otherDependency;
...
}
public void Process()
{
... //logic based on data
}
}
a
public class DataProcessor
{
public DataProcessor(IDataLoader dataLoader, otherDependency, ...)
{
this.DataLoader = dataLoader
this.otherDependecy = otherDependency;
...
}
public void Process()
{
data = DataLoader.LoadData();
... //logic based on data
}
}
tuttavia questa non è la mia soluzione preferita, poiché cambia perfettamente classe e implica che i dati devono sempre essere caricati, il che non è sempre il caso. Ad esempio, nei test unitari non carico dati ma creo solo un oggetto mock.