Supponiamo di avere varie entità nel mio modello (usando EF), ad esempio Utente, Prodotto, Fattura e Ordine.
Sto scrivendo un controllo utente in grado di stampare i riepiloghi degli oggetti entità nella mia applicazione in cui le entità appartengono a un set prestabilito, in questo caso dico che i riepiloghi dell'utente e del prodotto possono essere riassunti.
I riepiloghi avranno tutti solo un ID e una descrizione, quindi creo una semplice interfaccia per questo:
public interface ISummarizableEntity {
public string ID { get; }
public string Description { get; }
}
Quindi, per le entità in questione, creo una classe parziale che implementa questa interfaccia:
public partial class User : ISummarizableEntity
{
public string ID
{
get{ return UserID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} {1} is from {2} and is {3} years old", FirstName, LastName, Country, Age); }
}
}
public partial class Product: ISummarizableEntity
{
public string ID
{
get{ return ProductID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} weighs {1}{2} and belongs in the {3} department", ProductName, WeightValue, WeightUnit, Department); }
}
}
In questo modo il mio controllo utente / vista parziale può semplicemente legarsi a qualsiasi raccolta di ISummarizableEntity e non deve assolutamente interessarsi alla fonte. Mi è stato detto che le interfacce non dovrebbero essere usate come tipi di dati, ma non ho ottenuto più informazioni di così. Per quanto posso vedere, anche se le interfacce normalmente descrivono il comportamento, il solo uso delle proprietà non è un anti-modello in sé, poiché le proprietà sono comunque solo zucchero sintattico per getter / setter.
Potrei creare un tipo di dati e una mappa concreti dalle entità a quello ma non ne vedo il vantaggio. Potrei fare in modo che gli oggetti entità ereditino da una classe astratta e quindi definire le proprietà, ma poi sto bloccando le entità in modo da non poterle più utilizzare poiché non possiamo avere l'ereditarietà multipla. Sono anche aperto ad avere qualsiasi oggetto ISummarizableEntity se volessi (ovviamente rinominerei l'interfaccia)
La soluzione che sto usando nella mia mente è mantenibile, estensibile, testabile e abbastanza robusta. Riesci a vedere l'anti-pattern qui?
EntitySummary
,User
eProduct
ognuno con un metodo similepublic EntitySummary GetSummary()
?