Припустимо, у моїй моделі є різні об'єкти (використовуючи EF), скажімо, користувач, товар, рахунок-фактура та замовлення.
Я пишу користувальницький елемент управління, який може друкувати підсумки об’єктів сутності у моїй програмі, коли об'єкти належать до попередньо прийнятого набору, у цьому випадку я кажу, що резюме користувача та продукту можна узагальнити.
У всіх підсумках буде лише ідентифікатор та опис, тому я створюю простий інтерфейс для цього:
public interface ISummarizableEntity {
public string ID { get; }
public string Description { get; }
}
Тоді для відповідних організацій я створюю частковий клас, який реалізує цей інтерфейс:
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); }
}
}
Таким чином мій контроль / частковий погляд користувача може просто пов'язуватися з будь-якою колекцією ISummarizableEntity і не потрібно взагалі цікавитися джерелом. Мені сказали, що інтерфейси не слід використовувати як типи даних, але більше інформації я не отримав. Наскільки я бачу, хоча інтерфейси, як правило, описують поведінку, просто використання властивостей не є анти-зразком саме по собі, оскільки властивості - це лише синтаксичний цукор для геттерів / сеттерів.
Я міг би створити конкретний тип даних і відобразити сутність до цього, але не бачу користі. Я можу зробити об’єкти сутності успадкованими з абстрактного класу, а потім визначити властивості, але тоді я блокую сутності, щоб вони не використовувались більше, оскільки ми не можемо мати багаторазове успадкування. Я також відкритий для того, щоб будь-який об'єкт був ISummarizableEntity, якщо б я хотів (очевидно, я перейменував би інтерфейс)
Я використовую на увазі рішення, яке є ретельним, розширюваним, перевіреним та досить надійним. Ви можете побачити анти-візерунок тут?
EntitySummary
, зUser
іProduct
кожен з яких має метод , якpublic EntitySummary GetSummary()
?