2017-01-13 4 views
2

Я только начинаю изучать дизайн, управляемый доменом, и столкнулся с небольшим количеством дорожного блока.Как смоделировать ValueObject, который может принадлежать нескольким агрегатам

У меня есть много разных отношений, которые я пытаюсь создать в DDD-способе. Скажем, у меня есть виджет, который является моей совокупностью. Виджет может иметь список параметров, которые представляют собой объекты значений, описывающие виджетов.

Я думаю, что репо должно запросить список объектов значений, связанных с виджетами, и заполнить свойство «Параметры» виджета вместо создания отношения многих ко многим в EF.

My Domain Object выглядеть следующим образом:

public class Widget{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public List<Option> Options{get;set;} 
    public int DefaultOptionId{get;set;} 
} 

/* Value Object aka Look Up*/ 
public class Option{ 
    public int Id{get;set;} 
    public string Name{get;private set;} 
} 

Структура БД и данные:

Widget Table Data 
     ID: 1 , Name: Widget 1, DefaultOptionId: 2 
     ID: 2 , Name: Widget 2, DefaultOptionId: 3 

    Option Table 
     ID: 1 , Name: Option Name 1 
     ID: 2 , Name: Option Name 2 
     ID: 3 , Name: Option Name 3 
     ID: 4 , Name: Option Name 4 

    Relationship Table 
     WidgetId: 1 , OptionId: 2 
     WidgetId: 1 , OptionId: 3 
     WidgetId: 2 , OptionId: 2 
     WidgetId: 2 , OptionId: 3 
     WidgetId: 2 , OptionId: 4 
+1

Что должно произойти, когда параметр будет удален? Переименован? – guillaume31

+0

Это будет мой следующий вопрос :) Как люди обычно справляются с такой ситуацией? Список параметров может быть изменен с помощью области администрирования, но если параметр связан с виджетами, я не считаю, что пользователь должен иметь возможность, потому что тогда все виджеты, которые имеют этот параметр, будут меняться. Это кажется чрезмерно сложным, но должно быть общей задачей дизайна. – GregL

+1

Вам нужно решить, в * вашем * домене;) Случай с переименованием расскажет вам много, потому что он показывает, что параметр виджета заморожен в момент его добавления (возможно, больше значения Value-like), или если «master» Option может развиваться и всегда должен оставаться синхронизированным повсюду (скорее, Entity) – guillaume31

ответ

1

Ваше предложенное решение (репо список гидрат вариантов в качестве объектов значений) в порядке. Элементы-значения Option не могут быть изменены виджетами, поэтому общие ссылки не имеют никакого отношения к виджету.

Переименование опции не изменяет это решение, так как виджет просто заберет переименованный вариант, в следующий раз, когда он будет регидратирован репо.

Понятие «объект ценности» относится к контексту использования: в контексте виджета параметр является неизменным. В другом контексте (например, «Вариант») он может быть изменен (так что вы можете переименовать параметр).

Смотрите также https://martinfowler.com/bliki/ValueObject.html

+0

Спасибо! отличный ответ! Спасибо за ссылку, я думаю, что буду много читать сайт Мартина. Когда я знакомлюсь с DDD! – GregL

 Смежные вопросы

  • Нет связанных вопросов^_^