Avere un servizio che ad es. scarica dati, la cui responsabilità è ProgressReporter
? Dovrebbe essere la responsabilità del chiamante passare una valida, come in CodeSample1, o sarebbe meglio se fosse la responsabilità del creatore dell'oggetto come in CodeSample2? La prima opzione offre maggiore flessibilità in merito al possibile riutilizzo di questo oggetto funzione con diversa implementazione di IProgressReporter, mentre la seconda elimina la necessità di ripetere e passare attorno all'oggetto IProgressReporter.
CodeSample1:
public class WebClientDownloader : IDownloader
{
private IProgressReporter ProgressReporter { get; set; }
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// ...
}
private void DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
ProgressReporter?.Stop();
}
public Task<byte[]> GetBytesAsync(Uri uniqueResourceIdentifier,
IProgressReporter progress)
{
ProgressReporter = progress;
using (var client = new WebClient())
{
client.DownloadProgressChanged += ProgressChanged;
client.DownloadDataCompleted += DownloadCompleted;
return client.DownloadDataTaskAsync(uniqueResourceIdentifier);
}
}
CodeSample2:
public class WebClientDownloader : IDownloader
{
public IProgressReporter ProgressReporter { get; }
public WebClientDownloader(IProgressReporter progress)
{
ProgressReporter = progress;
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//...
}
private void DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
ProgressReporter?.Stop();
}
public Task<byte[]> GetBytesAsync(Uri uniqueResourceIdentifier)
{
ProgressReporter.Restart();
using (var client = new WebClient())
{
client.DownloadProgressChanged += ProgressChanged;
client.DownloadDataCompleted += DownloadCompleted;
return client.DownloadDataTaskAsync(uniqueResourceIdentifier);
}
}
}