WCF / Сервисный уровень / Уровень репозитория: Возвращение DTO из Сервисного уровня?И создание ViewModel в контроллере из DTO вернулся - PullRequest
1 голос
/ 09 мая 2011

Мне нужна помощь в моем текущем дизайне. У меня есть служба WCF, за службой WCF находится уровень службы (http://martinfowler.com/eaaCatalog/serviceLayer.html) и уровень хранилища.

Таким образом, клиент вызывает уровень службы WCF, а уровень службы WCF (выступая в качестве уровня службы) вызывает уровень хранилища.

Слой репозитория возвращает МОДЕЛИ (Poco's), которые представляют базу данных. Тогда сервисный уровень я предполагаю, что мне нужно преобразовать POCOS в DTO для передачи по проводам? Или я должен просто оставить их как POCO?

Как только у меня есть заданный объект на слое обслуживания, я возвращаю его клиенту (ASP.NET MVC), контроллер которого отвечает за отображение объекта, возвращенного из службы WCF, в VIEWMODEL.

Я хочу знать, что я делаю это правильно, то есть уровень сервиса и уровень репозитория позади службы WCF?

И контроллер, отвечающий за создание ViewModel из фактической модели, возвращаемой из службы WCF.

Также мне интересно, действительно ли необходимо конвертировать из РЕАЛЬНЫХ моделей, чтобы репозиторий возвращался в DTO, готовые вернуться из службы WCF.

Любая помощь действительно ценится

1 Ответ

5 голосов
/ 09 мая 2011

Что касается службы WCF, все выглядит хорошо.У вас есть модели, слой хранилища для доступа к данным, и вы возвращаете эти модели клиентам.Если вы должны использовать DTOs спорно.Если у вас есть POCO (не некоторые объекты, зависящие от ORM), все будет в порядке.Хотя бывают случаи, когда могут потребоваться DTO: например, круговые графы объектов, которые могут хорошо управляться ORM, но не могут быть сериализованы по проводам (совместимым образом).

Теперь для клиентской части:факт, что вы используете WCF, должен быть деталью реализации.Таким образом, в вашем приложении ASP.NET MVC у вас будет хранилище, работающее с POCO, которые вы импортировали, когда вы svcutil.exe редактировали свою службу, и затем реализация этого хранилища, которая будет выполнять фактический вызов службы (возможно, с использованием автоматически сгенерированного ServiceClient).учебный класс).Тогда ваши контроллеры должны работать с абстрактным репозиторием и иметь инфраструктуру DI, настроенную для внедрения фактической реализации.Когда действие контроллера вызывает некоторый метод репозитория, он получает POCO, который затем обрабатывается на уровне отображения ( AutoMapper ?) Для преобразования в конкретную модель представления, передаваемую в представление.И наоборот: действие контроллера получает модель представления из вида в качестве параметра действия, использует слой отображения, чтобы отобразить его обратно в POCO, который будет передан в репозиторий, который возьмет на себя ответственность за выполнение требуемой задачи с этой моделью.(в вашем случае и конкретной реализации, которая будет передавать его какой-то удаленной службе WCF).

...