Caso in questione in Entity Framework, ma questa è una domanda di progettazione che è applicabile a qualsiasi ORM.
Nell'attuale applicazione abbiamo un paio di classi di dati ORM che fanno cose non direttamente correlate alla funzione di quella classe.
Un esempio è la classe Document, che è una rappresentazione del database del documento memorizzato sull'unità di rete. Ha un costruttore che effettivamente fa una copia fisica del documento:
public Document(string filePath, int categoryId, User currentUser)
{
FileInfo info = new FileInfo(filePath);
this.Name = info.Name;
this.Size = info.Length.ToString();
this.CategoryId = categoryId;
this.User = currentUser;
this. CreatedOn = DateTime.Now;
targetPath = ConfigurationManager.AppSettings["CampaignFolder"];
FileHelper.CopyFile(filePath, targetPath + "\" + this.Name);
}
Puoi vedere come sarebbe conveniente, specialmente se stai caricando potenzialmente file da molti punti del codice e vuoi che vengano archiviati in una posizione centrale.
Un altro esempio è la classe Category, che è correlata a quanto sopra. La classe stessa ha una funzione che deve tornare al repository per fare qualche lavoro aggiuntivo - quindi ne passiamo una in:
public List<Document> SearchDocuments(string description, IRepository rep)
{
if (this.Documents.Any(dc => dc.Description == description))
{
return this.Documents.(dc => dc.Description == description).ToList();
}
using (IRepository r = rep.Renew())
{
return r.GetDocuments(d => d.CategoryId == this.CategoryId
&& dc.Description == description).ToList();
}
}
Ancora una volta, puoi vedere come questo è conveniente: usa le proprietà inerenti all'oggetto, ed è un posto utile dove mettere questa funzione se viene chiamata da molti posti diversi.
Vale anche la pena notare che quest'ultima funzione, almeno, non rompere la testabilità.
Tuttavia, non posso aiutare la sensazione che ciò sia sbagliato in qualche modo. Sembra una violazione di una singola responsabilità - queste cose sono solo per il trasporto di dati e forse alcune proprietà calcolate. D'altro canto, mettere al loro interno funzioni come queste rimuove il fastidioso proliferare delle classi helper.
Questa è una cattiva idea? O mi preoccupo per niente?