Мне очень нравится OData (службы данных WCF). В прошлых проектах я написал так много веб-сервисов, чтобы разрешить разные способы чтения моих данных.
OData обеспечивает большую гибкость для клиентов, чтобы они могли получать данные по мере необходимости.
Однако в сегодняшнем обсуждении коллега указал, что то, как мы делаем OData, — это не более чем предоставление клиентскому приложению подключения к базе данных.
Вот как мы настраиваем нашу службу данных WCF (примечание: это традиционный способ)
- Создайте модель данных Entity Framework (E)F нашей базы данных
- Опубликуйте эту модель с помощью служб данных WCF.
- Добавьте безопасность в фид OData
(вот где это лучше, чем прямое подключение к SQL Server)
Мой коллега (правильно) указал, что теперь все наши клиенты будут связаны с базой данных. (Если таблица или столбец подверглись рефакторингу, клиенты тоже должны будут измениться)
EF предлагает некоторую гибкость в отношении представления ваших данных и может использоваться для сокрытия некоторых незначительных изменений базы данных, которые не влияют на клиентские приложения. Но я обнаружил, что он весьма ограничен. (См. этот пост для примера) Я обнаружил, что шаблоны POCO (хотя и хороши тем, что позволяют разделить модель и объекты) также не обеспечивают большой гибкости.
Итак, вопрос: что мне сказать коллеге? Как настроить мои службы данных WCF, чтобы они использовали бизнес-ориентированные контракты (как если бы каждая операция чтения использовала стандартную службу на основе WCF Soap)?
Просто чтобы внести ясность, позвольте мне спросить об этом по-другому. Как я могу отделить EF от служб данных WCF. Я могу составить свои собственные контракты и использовать AutoMapper для преобразования между ними. Но я бы не хотел сразу переходить от EF к OData.
ПРИМЕЧАНИЕ. Я все еще хочу использовать EF в качестве ORM. Прокат моего собственного ORM на самом деле не решение...