Вопрос о доменной / объектной модели - PullRequest
0 голосов
/ 19 августа 2011

У меня есть история, которой можно назначить одного знаменателя.Номинатор может быть назначен на несколько историй.Номинатор может перенести историю в свой избирательный бюллетень (не история может принадлежать только их избирательному бюллетеню).В прошлом я всегда делал приложения, управляемые данными, поэтому, к сожалению, я уже думаю о том, как справиться с голосованием.Поскольку таблице Story назначен идентификатор номинатора, имеет смысл добавить в таблицу флаг IsBallot.Но теперь в моем настоящем дизайне предметной области у истории есть поведение, чтобы добавить себя в избирательный бюллетень (который кажется странным, так как есть правила, привязанные к номинатору на этом)Я думаю, он мог бы спросить номинанта, может ли он добавить себя в избирательный бюллетень.Второй вариант - иметь другую таблицу StoryBallot, которая содержит идентификатор номинатора и идентификатор истории.Что здесь странного - история уже содержит идентификатор номинатора, и в этой новой таблице он также есть.

любые идеи или предложения будут великолепны!

1 Ответ

1 голос
/ 19 августа 2011

Если я правильно понимаю, ваш домен можно смоделировать так:

- A Nominator has stories
- A Nominator can nominate Stories for a Ballot

- A Ballot knows all its Stories and their respective Nominator

- A Story knows its Nominator

Используя доменно-управляемый дизайн, мы вообще не будем думать о таблицах. Мы думаем об агрегатах и, возможно, даже об ограниченных контекстах. Но чтобы не усложнять вещи, я сохраню их на уровне совокупности:

У нас может быть два совокупных корня:

1. Nominator (who knows all their stories)
2. Ballot (which knows all their nominated stories as 
   well as the respective nominators)

Возможно, к самой истории вообще не будет доступа напрямую, но только через Номинатор или Бюллетень соответственно.

Есть ли причина, по которой история существует, если она не принадлежит номинатору или не выдвинута в избирательный бюллетень? Если нет, сделайте его недоступным сам по себе и только выставьте напр. Nominator.GetStories(), Nominator.GetNominatedStoriesFor(ballot) и / или Ballot.GetStories()

Чтобы добавить историю в избирательный бюллетень, я бы либо выставил Nominator.NominateStory(storyId, ballotId), либо Ballot.Add(storyId).

Когда дело доходит до хранения в базе данных, у меня, вероятно, будет таблица NominatedStories с ballotId и storyId и таблица Stories с подробностями истории и nominatorId

...