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