Могу ли я получить доступ к репозиторию из уровня представления?

Я начинаю с ДДД. Меня немного смущает взаимодействие между несколькими уровнями, участвующими в приложении DDD.

Могу ли я вызвать свои репозитории из моего уровня представления? Если нет, нужно ли мне копировать функции CRUD, предоставляемые репозиториями на моем сервисном уровне (который, конечно, в свою очередь будет использовать репозиторий для этих функций)? Как лучше всего это сделать?


person Ali Kazmi    schedule 08.09.2009    source источник


Ответы (4)


Что именно вы подразумеваете под уровнем представления? Если вы имеете в виду Контроллер/Ведущий, то все в порядке. Эмпирическое правило, которое я использовал, заключается в том, что если действие контроллера состоит из 4 строк кода или более, я должен рассмотреть рефакторинг для класса службы приложения, но все же - оба находятся на уровне приложения, и вы, безусловно, можете использовать там репозитории.

То, как вы сформулировали свой вопрос - и я, безусловно, мог неправильно это истолковать - звучало подозрительно, как будто вы думали сослаться на репозиторий со своего представления или кода программной части. В таком случае я бы сказал нет! нет! нет!

person George Mauer    schedule 08.09.2009
comment
Да в том то и дело. Я говорил о ссылке на это из моего кода - person Ali Kazmi; 09.09.2009
comment
Хорошо, тогда да, это плохо. Код программной части — это не уровень представления, код программной части на самом деле является частью вашего представления. В стандартных веб-терминах на программный код следует смотреть так же, как на очень простой javascript. Переместите любую логику в класс Controller или Presenter и внедрите в него свои репозитории через конструктор. - person George Mauer; 10.09.2009
comment
Итак, чтобы уточнить: то, что вы говорите, плохо, потому что вы ссылаетесь на репозиторий на уровне просмотра, а не на уровне представления. - person George Mauer; 10.09.2009

Безусловно, вы можете вызвать репозиторий из уровня представления. Мой единственный совет состоит в том, чтобы ваш уровень представления зависел от абстракции репозитория, а не от реализации, т. е. UserSession зависит от интерфейса IPersonRepository, а не от класса PersonRepository. Это не только хорошее разделение задач, но и упрощает тестирование.

Действуй!

person Kevin Swiber    schedule 08.09.2009
comment
Я бы добавил, что это также упрощает внедрение зависимостей и использование инфраструктуры IoC, такой как Ninject, что, в свою очередь, упрощает написание тестов. - person Matthew Groves; 09.09.2009
comment
Я не пояснил в своем вопросе, но в этом случае я имел в виду код на странице ASP.NET как уровень представления. Будете ли вы по-прежнему говорить, что можно вызывать репозиторий (то есть, конечно, через интерфейс)? - person Ali Kazmi; 09.09.2009
comment
@Ali: Мой совет: выберите шаблон презентации, который соответствует вашим потребностям. Используя контроллер или презентатор, вам никогда не придется вызывать репозиторий напрямую из кода программной части. У Дино Эспозито есть отличная статья журнала MSDN Magazine о шаблонах представления ASP.NET. (msdn.microsoft.com/en-us/magazine/dd252940.aspx) Вы можете извлечь наибольшую выгоду из использования шаблона MVP с веб-формами. Удачи! - person Kevin Swiber; 09.09.2009

Обычно я использую сервисный уровень, но использование вашего репозитория не повредит.

person Hannoun Yassir    schedule 08.09.2009

Как говорит Кевин, использование контроллера или ведущего дает вам много преимуществ.

К ним относится четкое разделение проблем, а также возможность тестирования.

Лично я в настройках ASP.NET предпочел бы «пассивный просмотр» Fowler .

Вы просто проектируете свои страничные контракты как интерфейсы, которые имеют конкретные реализации в виде веб-форм, а затем вы просто заглушаете/издеваетесь над ними при тестировании своих докладчиков.

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

person Martin R-L    schedule 15.09.2009