Когда разделять определенные объекты на разные репозитории?

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

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

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

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

    • UserPrefence
    • порядок
  • порядок

    • Товар

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам