Мы используем Linq to SQL для чтения и записи наших доменных объектов в базу данных SQL Server.
Мы предоставляем ряд услуг (через WCF) для выполнения различных операций. Конкретно реализация этих операций состоит из трех этапов: воссоздание необходимых доменных объектов из базы данных; выполнить операцию над объектами домена; сохранить (теперь измененные) объекты домена обратно в базу данных.
Проблема заключается в том, что иногда существуют два или более экземпляров одного и того же объекта сущности, что может привести к несоответствиям при сохранении объектов обратно в БД. Небольшой выдуманный пример:
public void Move(string sourceLocationid, destinationLocationId, itemId);
, который должен перемещать элемент с заданным идентификатором из источника в место назначения (реальные услуги более сложны, часто включают в себя множество мест, предметов и т. Д.). Теперь может случиться так, что и идентификатор источника, и идентификатор места назначения одинаковы - наивная реализация просто воссоздает два экземпляра объекта-сущности, что приведет к проблемам.
Эта проблема теперь "решена", проверяя ее вручную, то есть мы восстанавливаем первое местоположение, проверяем, отличается ли его идентификатор от второго, и если да, то повторно устанавливаем второе, и так далее. Это, конечно, сложно и подвержено ошибкам.
Во всяком случае, я был действительно удивлен, что, похоже, не существует «стандартного» решения для этого в управляемом доменом дизайне. В частности, кажется, что хранилища или фабрики не решают эту проблему (если они не поддерживают свой собственный кеш, который затем необходимо обновить и т. Д.).
Моя идея заключается в создании объекта DomainContext для каждой операции, которая отслеживает и кэширует объекты домена, используемые в этом конкретном методе. Вместо того, чтобы восстанавливать и сохранять отдельные доменные объекты, такой объект будет восстановлен и сохранен как единое целое (возможно, с использованием репозиториев), и он может действовать как кэш для доменных объектов, используемых в этой конкретной операции.
В любом случае, кажется, что это обычная проблема, так как с этим обычно справляются? Что вы думаете об идее выше?