Как моделировать сущности для обеспечения ограничений моделей данных во время компиляции? - PullRequest
4 голосов
/ 24 февраля 2012

У меня есть следующая модель данных, которая ограничивает ItemTypes с подмножеством События .Каждый ItemType имеет действительный набор Events , это ограничено в таблице ItemEvent.Например, видео может быть {воспроизведено, остановлено, приостановлено}, изображение может быть {изменено, сохранено или передано в общий доступ} и т. Д.

enter image description here

Что такоелучший способ отразить это ограничение в модели Entity, чтобы я мог получить гарантию времени компиляции, что используемое Событие действительно для определенного Предмета?В частности, я рефакторинг метода AddItemEventLog:

public void AddItemEventLog(Item item, string ItemEvent)
{
    //
}

Очевидно, это надуманный пример, просто пытаюсь проиллюстрировать - он позволяет разработчику передавать любую строку ItemEvent, которую они хотят.Даже если я создаю перечисление на основе набора результатов ItemEvent, в модели сущностей ничего не будет, чтобы разработчик не мог передать ItemEvent.Resize с элементом типа Видео .

У меня есть Item в качестве базового класса Video, и я попытался переопределить перечисление, но теперь знаю, что это невозможно.Меня меньше интересует проверка действительности события во время выполнения, так как я уже сгенерирую исключение, когда БД выдает нарушение FK.Я хочу пресечь это в зародыше во время кодирования, если это возможно :)

В настоящее время классы смоделированы так, но открыты для любых изменений:

 //enums.cs
 public enum ItemType : byte
 {
     Video = 1,
     Image = 2,
     Document = 3
 }

 //item.cs
 public class Item : BaseModel
 {
     public int ItemId { get; set; }
     public ItemTypeLookup.ItemType ItemType { get; set; }
     public string ItemName { get; set; }
 }

//video.cs
public class Video : Item
{
    public string Width { get; set; }
    public string Height { get; set; }
    public string Thumb { get; set; }
}

1 Ответ

2 голосов
/ 25 февраля 2012

Я думаю, что Кодовые контракты могут быть единственным способом обеспечить что-то подобное во время компиляции.Помимо проверок во время компиляции, следующим шагом будет написание модульных тестов для обеспечения правильной функциональности!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...