Ho una classe che viene eseguita come servizio e restituisce il codice html di un sito web quando viene fornito con un URL.
Il codice:
public interface IHtmlDownloader
{
IWebProxy Proxy { get; set; }
string UserAgent { get; set; }
string GetHtml(string url)
}
public class HtmlDownloader : IHtmlDownloader
{
WebClient _client;
public IWebProxy Proxy
{
get { return _client.Proxy; }
set { _client.Proxy = value; }
}
public string UserAgent
{
get
{ return _client.Headers[HttpRequestHeader.UserAgent].ToString(); }
set
{ _client.Headers[HttpRequestHeader.UserAgent] = value; }
}
public HtmlDownloder()
{
_client = new WebClient();
}
public string GetHtml(string url)
{
this.CheckValidity(url);
var htmlOfWebsite = _client.DownloadString(url);
return htmlOfWebsite;
}
}
Ora non sono sicuro di come esattamente dovrei convalidare l'URL. So che non dovrebbe essere nullo o spazio bianco o altro, ma dovrei convalidare che si tratta in effetti di un URL costruito correttamente?
Così facendo si otterrebbe un metodo che eseguirà la convalida. Potrei semplicemente creare un metodo statico pubblico all'interno di HtmlDownloader
in modo che il chiamante possa convalidare l'URL, o forse nemmeno uno statico ( GetUrl(string url)
è chiamato dopo che l'oggetto è stato istanziato), ma sarebbe sbagliato per almeno due ragioni:
- Sarebbe un validatore applicabile in così tanti posti e dovrebbe essere disponibile per altre classi.
- Non riesco a contrarre un metodo statico con un'interfaccia.
Inoltre, non dovrebbe essere reso statico, ma piuttosto un servizio, quindi potrei testare l'unità HtmlDownloader
(il servizio verrebbe iniettato tramite il costruttore).
Tutte queste idee sono piuttosto terribili e sto iniziando a pensare che non dovrei convalidare nulla, ma semplicemente creare un blocco try/catch
che catturerebbe l'eccezione appropriata e poi lanciare un'eccezione UrlNotFoundException con l'eccezione originale fornita attraverso InnerException.
Tuttavia, sarebbe bello verificare la validità dell'URL. Ma a chi e come? Il chiamante deve essere iniettato con il servizio adeguato? Ma allora, cosa succede se l'URL è generato più alto del chiamante e il chiamante lo passa semplicemente su HtmlDownloader? Dove dovrei convalidare l'URL? O è il semplice fatto che l'URL deve passare attraverso alcuni livelli un odore di codice?