Хранилище и неизменяемые объекты? - PullRequest
4 голосов
/ 15 апреля 2009

Я могу быть обречен несоответствием импеданса, но я пытаюсь согласовать примеры, которые я видел для IRepository и неизменных объектов.

Я работаю над приложением каталогизации, в котором сотни веб-запросов работают с «рабочим набором» продуктов - подмножество всего каталога, как правило, работает в любой момент времени.

В то же время наши группы данных постоянно обновляют данные о продукте - новые изображения, обновленные цены, описания и т. Д. И т. Д.

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

Но эта идея, похоже, нарушена многими примерами IRepository, которые я видел в методах Update / Delete - как только поток может писать в продукт, создается впечатление, что я открываю себя гонкам и другим злобам.

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

Имеет ли это какой-то смысл? Может ли это работать с репозиторием, как я их описал?

Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 15 апреля 2009

Хранилище отвечает только за поиск / хранение данных. За создание новых объектов отвечает фабрика.

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

В случае обновления продукта вам необходимо убедиться, что вы создаете новый продукт через фабрику. Ваш репозиторий будет включать только три вида операций: «Извлечь» (или «Найти»), «Сохранить» и «Заменить». Где Save хранит новый товар, который не изменился. И Supersede будет хранить новый продукт, аннулировать старый и удалять его из кэша.

С точки зрения сигнатуры C # я мог бы представить, что два метода хранения имеют следующий вид:

void Save(Product product);

void Supersede(Product oldProduct, Product newProduct);

Надеюсь, это поможет.

1 голос
/ 15 апреля 2009

Существуют ли такие высокие требования к параллелизму или производительности, что вы не можете сделать простую блокировку, либо эксклюзивную / пессимистическую, либо оптимистическую ?

...