Ho un vecchio rompicapo, quindi ho pensato di condividerlo con te, forse avrò la giusta direzione. Il fatto è che alcune delle nostre entità nel database sono piuttosto grandi (leggi hanno molte proprietà) e raramente la logica aziendale utilizza tutte le proprietà dell'entità, quindi ogni volta ho bisogno di pensare quali proprietà devono essere caricate affinché la logica di business funzioni correttamente. Molto ipotetico campione:Le entità fanno troppo?
public class Product
{
public string Title {get;set;}
public string Description {get;set;}
public string RetailPrice {get;set;}
public string SupplierId {get;set;}
public Supplier Supplier { get;set;}
// many other properties
}
public class ProductDiscountService
{
public decimal Get(Product product)
{
// use only RetailPrice and Supplier code
return discount;
}
}
public class ProductDescriptionService
{
public string GetSearchResultHtml(Product product)
{
// use only Title and Description
return html;
}
}
Sembra che ho potuto estrarre interfacce IDiscountProduct e ISearchResultProduct, prodotto marchio come attuazione di queste interfacce, quindi creare DTOs più piccole di attuazione ciascuna di queste interfacce, ma che guarda al momento come eccessivo (almeno Non ho visto nessuno raggruppare le proprietà usando le interfacce).
Per dividere l'entità nel database in entità più piccole anche non sembra ragionevole, poiché tutte queste proprietà appartengono al prodotto e temo che sarò costretto a utilizzare molti join per selezionare qualcosa e se deciderò che alcune proprietà appartengono a un'altra entità, questa mossa sarà piuttosto difficile da implementare.
Per avere ogni proprietà utilizzata nella logica di business di un particolare metodo come parametro di metodo sembra anche una soluzione non valida.
Di quante proprietà stiamo parlando? – walther
in genere più di 10, meno di 20. – Giedrius
Direi: se il metodo conosce in anticipo quali proprietà utilizzare e questo rimane fisso, l'utilizzo dei parametri potrebbe essere una buona soluzione. Facile da testare e facile da riutilizzare. Tuttavia, se l'implementazione non è definita nella firma del metodo (l'implementazione corrente utilizza 2 proprietà ma domani potrebbero diventare 3), si desidera utilizzare l'intera caratteristica del prodotto con tutte le proprietà disponibili. Questo parla in modo coerente: questo metodo richiede questi parametri e questo metodo richiede un prodotto. – Polity