Immagina che ci sia un'interfaccia IPriceProvider che dovrebbe servire a 2 bisogni: storici e recenti. Quindi penso che abbiamo 2 opzioni qui.
Per prima cosa:
PriceInfo GetLatestPrice(string symbol);
PriceInfo GetHistoricalPrice(string symbol, DateTime pointInTime);
Secondo:
PriceInfo GetPrice(string symbol, DateTime pointInTime);
Secondo me il secondo è migliore, perché è più flessibile. Immagina, hai un rapporto che è fin d'ora - quindi chiama questo fornitore di prezzi come questo:
GetPrice("EURUSD", _dateTime.Now);
Quindi, se c'è un compito per mostrare ciò che questo rapporto esatto stava mostrando ieri alle 17:35, imposterò semplicemente _dateTime.Ora fino a quel punto e il mio rapporto funzionerà. Ma nel caso del primo approccio, dove lo chiamo in questo modo:
GetLatestPrice("EURUSD");
Avrò bisogno di una seconda implementazione di IPriceProvider, quindi avrò un problema di cablaggio, dovrò configurare il mio contenitore DI in un modo speciale e così via ...
Mi manca qualcosa? Quali sono i pro e i contro in questi 2 approcci?
Aggiornamento:
La classe Report potrebbe essere simile a questa:
public class Report
{
private readonly IDateTime _dateTime;
private readonly IPriceProvider _priceProvider;
public Report(IDateTime dateTime, IPriceProvider priceProvider)
{
_dateTime = dateTime;
_priceProvider = priceProvider;
}
public void Run()
{
var latestPrice = _priceProvider.GetPrice("EURUSD", _dateTime.Now);
// do the report calc here
}
}