Хранилища, по крайней мере, насколько мне известно, являются местом для бизнес-правил. Это просто фасад, имитирующий коллекцию; под ними в основном чистый доступ к данным (если это их работа, вы, возможно, не сохраняете ничего и с репозиторием). Поэтому не следует рассматривать отдельные репозитории по причинам «бизнес-правил».
Если ваши доменные объекты действительно являются отдельными объектами, то у вас должны быть отдельные репозитории. Помните, что такое хранилище: это фасад. Он имитирует коллекцию в вашем домене. Смотрите здесь для действительно хорошего сообщения в блоге на Репозитории: http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx
Хранилище является фасадом; абстракция.
Тем не менее ... Я не думаю, что у вас есть отдельные объекты. У вас есть некоторые проблемы, которые не имеют ничего общего с репозиториями и все, что связано с доменом и дизайном домена. Являются ли два типа «временных карт» на самом деле две разные вещи, или они действительно одинаковы?
Вы говорите, «Но мне немного странно, что я могу получить одну и ту же запись из двух разных репозиториев».
Это говорит мне о том, что на самом деле это одинаковые данные, выраженные по-разному. И есть способы справиться с этим.
Если это действительно так, то у вас есть подклассы общего базового класса (что-то, что может быть легко смоделировано в БД и, например, элегантно обработано с помощью NHibernate).
Я приведу вам пример проекта, над которым я работаю. У меня есть то, что называется «Трансляция». Это базовый класс; Аннотация. Не может быть создан. У меня есть два конкретных конкретных типа этого класса: DeviceBroadcast и FileBroadcast. Один передает аудио / видео с устройства (например, карты захвата DirectX), а другой - аудио / видео с источника файла (например, .mp3).
У меня есть один репозиторий, который возвращает объект Broadcast. Я могу привести его к FileBroadcast, чтобы манипулировать конкретной информацией о FileBroadcast, или я могу привести его к DeviceBroadcast по той же причине - если он такого типа. Broadcast не может быть одновременно FileBroadcast и DeviceBroadcast. Это должен быть один или другой.
В базе данных я сохраняю общие параметры вещания в таблице Broadcast, а затем сохраняю специфические свойства файла в таблице FileBroadcast. То же самое касается таблицы DeviceBroadcast; отдельный. Однако когда я делаю запрос через репозиторий, я просто хочу трансляции. Это мой корневой агрегатный объект и, следовательно, мой репозиторий.
Базовый класс Broadcast имеет общие методы, которые используют оба подкласса (например, метод GetCommand (), который возвращает определенный аргумент командной строки для запуска процесса VLC). Подклассы должны переопределить и реализовать этот метод, потому что он абстрактный. Таким образом, «бизнес-логика», которая уникальна для FileBroadcast, содержится в классе FileBroadcast. «Бизнес-логика», уникальная для DeviceBroadcast, содержится в классе DeviceBroadcast. Любая общая для обоих логика содержится в суперклассе Broadcast.
Кажется, у вас похожая ситуация, и поэтому я делюсь своим дизайном. Я думаю, что это может послужить вам хорошо.
Прежде всего, подумайте о своем домене и данных. Если вы собираетесь получать дубликаты данных с помощью отдельных репозиториев, вам нужно больше думать о том, как вы разрабатываете домен. Не позволяйте пользователям диктовать дизайн вашего домена. Они знают область с их точки зрения. Все, что вам нужно сделать, - это предоставить им данные так, как они понимают. Это не значит, что у вас должен быть плохой дизайн; У вас может быть хороший дизайн за кулисами, потому что ваш код - это то, что должно использовать домен.