Когда разделять определенные объекты в разные репозитории? - PullRequest
4 голосов
/ 15 декабря 2008

Я обычно стараюсь хранить все связанные сущности в одном и том же хранилище. Ниже перечислены объекты, имеющие отношения между ними (отмечены отступом):

  • Пользователь
    • UserPreference

Так что им есть смысл заходить в репозиторий пользователей. Однако пользователи часто связаны со многими различными объектами, что бы вы сделали в следующем примере?

  • Пользователь

    • UserPrefence
    • Заказать
  • Заказать

    • Продукт

Заказ связан как с продуктом, так и с пользователем, но вы не поместите функциональность для всех 4 сущностей в одном хранилище. Что вы делаете, когда имеете дело с пользовательскими объектами и собираете информацию о заказе? Вам может потребоваться дополнительная информация о продукте, и часто ORM предлагают возможность ленивой загрузки. Однако, если ваша сущность продукта находится в отдельном хранилище для сущности пользователя, то это наверняка вызовет конфликт между хранилищами?

Ответы [ 4 ]

5 голосов
/ 16 декабря 2008

В смысле Эрика Эвана, управляемого доменом (http://domaindrivendesign.org/index.htm), вы должны сначала подумать о своих агрегатах. Затем вы создаете свои репозитории вокруг них.

Существует множество методов обработки агрегатов, которые связаны друг с другом. Чаще всего я использую, чтобы агрегаты могли связываться друг с другом только через интерфейс только для чтения. Одна из ключевых идей Aggregates заключается в том, что вы не можете изменить состояние базовых объектов, не пройдя корень. Поэтому, если Продукт и Пользователь являются корневыми агрегатами в вашей модели, я не смогу обновить Продукт, если попал в него через Пользователь-> Заказ-> Продукт. Я должен получить продукт из репозитория продукта, чтобы отредактировать его. (С точки зрения пользовательского интерфейса вы можете сделать так, чтобы пользователь выглядел как Пользователь-> Заказ-> Продукт, но когда вы попадаете на экран редактирования Продукта, вы получаете объект из Репозитория продуктов).

Когда вы смотрите на Продукт (в коде), перейдя из Пользователь-> Заказ-> Продукт, вы должны смотреть на Интерфейс Продукта, который не имеет никакого способа изменить основное состояние Продукта (только не получает комплекты и т. д.)

Организуйте свои Агрегаты и их хранилища по способу их использования. Я вижу, что User и Prodcut являются их собственными агрегатами и имеют свои собственные репозитории. Из вашего описания я не уверен, должен ли Заказ принадлежать Пользователю или также быть отдельным.

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

Если ваши репозитории кэшируются, то при загрузке заказа (через пользователя) загружаются только идентификаторы продуктов из базы данных. Затем загрузите данные из хранилища продуктов, используя идентификатор продукта. Вы можете немного оптимизировать, загружая любые другие инварианты в Продукт по мере загрузки Заказа.

1 голос
/ 16 декабря 2008

Под хранилищем вы подразумеваете класс?

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

0 голосов
/ 18 декабря 2008

Я все еще смущен тем, что вы подразумеваете под "хранилищем". Я хотел бы сделать все, что вы говорили об отдельных классах (и, следовательно, об отдельных файлах), и все они будут находиться в одном проекте.

0 голосов
/ 15 декабря 2008

Если SQL Server является вашей базой данных, а под репозиторием вы подразумеваете базу данных, то я бы просто поместил информацию в любую базу данных, которая имеет смысл, и получил бы представление о зависимых базах данных, которые выбираются из другой базы данных посредством трехточечной нотации.

...