Angenommen, ich habe verschiedene Entitäten in meinem Modell (mit EF), z. B. Benutzer, Produkt, Rechnung und Bestellung.
Ich schreibe ein Benutzersteuerelement, das die Zusammenfassungen von Entitätsobjekten in meiner Anwendung drucken kann, in denen die Entitäten zu einer vorab festgelegten Menge gehören. In diesem Fall sage ich, dass Zusammenfassungen von Benutzer und Produkt zusammengefasst werden können.
Die Zusammenfassungen haben alle nur eine ID und eine Beschreibung, daher erstelle ich eine einfache Schnittstelle dafür:
public interface ISummarizableEntity {
public string ID { get; }
public string Description { get; }
}
Dann erstelle ich für die fraglichen Entitäten eine Teilklasse, die diese Schnittstelle implementiert:
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); }
}
}
Auf diese Weise kann meine Benutzersteuerung / Teilansicht nur an eine Sammlung von ISummarizableEntity gebunden werden und muss überhaupt nicht an der Quelle interessiert sein. Mir wurde gesagt, dass Schnittstellen nicht als Datentypen verwendet werden sollten, aber ich habe nicht mehr Informationen erhalten. Soweit ich sehen kann, obwohl Schnittstellen normalerweise das Verhalten beschreiben, ist die bloße Verwendung von Eigenschaften an sich kein Anti-Pattern, da Eigenschaften ohnehin nur syntaktischer Zucker für Getter / Setter sind.
Ich könnte einen konkreten Datentyp erstellen und diesen die Entitäten zuordnen, aber ich kann den Nutzen nicht erkennen. Ich könnte die Entitätsobjekte von einer abstrakten Klasse erben lassen und dann die Eigenschaften definieren, aber dann sperre ich die Entitäten für keine weitere Verwendung, da wir keine Mehrfachvererbung haben können. Ich bin auch offen dafür, dass jedes Objekt ISummarizableEntity ist, wenn ich wollte (natürlich würde ich die Schnittstelle umbenennen).
Die Lösung, die ich in meinem Kopf verwende, ist wartbar, erweiterbar, testbar und ziemlich robust. Kannst du das Anti-Muster hier sehen?
EntitySummary
,User
undProduct
jeder eine Methode hatpublic EntitySummary GetSummary()
?