Тип объединения в DDD модель и в базе данных - PullRequest
0 голосов
/ 19 февраля 2020

В баскетбольном матче НБА я хочу хранить данные о каждой игре Одна игра имеет свои StartTime, две Team с и список игр. Каждый Play имеет свое появление во времени и (в зависимости от игры) различные свойства. Существует 8 различных типов игры, например: «Отскок», «FieldGoalAttempt»:

Отскок:

  • команда
  • игрок
  • reboundType

Попытка достижения цели:

  • команда

  • ShoppingPlayer

  • AssistingPlayer

  • blockingPlayer

  • shotType

  • distanceFeet

  • очков

  • местоположение

  • результат

Как видите, эти две игры совершенно разные - и есть еще 6 типов. Что подводит меня к моей первой проблеме.

Вопрос 1: Как мне реализовать это в C#?

Моя идея состоит в том, чтобы создать тип Play, а затем 8 классов, представляющих типы воспроизведения, например Rebound, FieldGoalAttempt, JumpBall, например:

public class Play
{
    public int PlayId { get; set; }
    public int GameId { get; set; }
    public int PlayerId { get; set; }

    public Rebound Rebound { get; set; }
    public FieldGoalAttempt FieldGoalAttempt { get; set; }
    public Turnover Turnover { get; set; }
    public Foul Foul { get; set; }
    ...
    public JumpBall JumpBall { get; set; }

    public Game Game { get; set; }
    public Player Player { get; set; }
} 

Но Я не был уверен, что это «кодовый запах». У меня было еще несколько идей: список object с? или пользовательский класс C#, который действует как "Союз"? Итак, первый вопрос: как мне справиться с этой ситуацией в C#? Моя первая идея хороша?

Вопрос 2: В конце концов, я хочу сохранить эти пьесы в базе данных. В моей архитектуре я использую модели, которые представляют таблицы в базе данных. Для моей логики c я создаю Service, поэтому модели являются "anemi c", которые некоторые люди называют "анти-паттернами", но я не хочу об этом говорить. У меня есть Службы для моей логики c, и она работает для меня.

Если я решу создать Union подобный класс - Как мне сохранить эти пьесы в базе данных?

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете использовать наследование для этого. Например:

public class BasePlay
{
    public DateTimeOffset StartTime { get; set; }
    public Team TeamA { get; set; }
    public Team TeamB { get; set; }
}

public class JumpBallPlay : BasePlay
{
    public string ExtraProperty1 { get; set; }
}

public class FieldGoalAttemptPlay : BasePlay
{
    public string ExtraProperty2 { get; set; }
}

Затем вы можете сопоставить эти классы с EntityFramework, используя Наследование таблиц :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BasePlay>()
        .HasDiscriminator<string>("PlayType")
        .HasValue<JumpBallPlay>("jumpBall")
        .HasValue<FieldGoalAttemptPlay>("fieldGoalAttemptPlay");
}

Все ваши объекты будут храниться в одной таблице, но сопоставлены с другими столбцами (с некоторыми общими для всех столбцов из BasePlay, см. раздел Общие столбцы ). Дополнительный столбец PlayType будет содержать тип игры.

...