Ленивая загрузка с моделью домена службы WCF?
-
09-06-2019 - |
Вопрос
Я пытаюсь вставить свою модель предметной области в API-интерфейс службы WCF и хотел бы подумать о методах отложенной загрузки с помощью этого типа установки.
Есть ли какие-либо предложения при выборе такого подхода?
<Ч>Когда я реализовал эту технику и вошел в свое приложение, незадолго до того, как сервер возвращает мой список, он получает доступ к каждому свойству, которое, как предполагается, загружается с отложенной загрузкой ... Таким образом, нетерпеливая загрузка. Не могли бы вы объяснить эту проблему или предложить решение?
Изменить: появляется вы можете использовать атрибут XMLIgnore, чтобы на него не смотрели во время сериализации ... все же читаем об этом, хотя
Решение
Как и в случае любой удаленной архитектуры, вам следует избегать загрузки полного графа объектов "по проводам" неконтролируемым образом (если у вас нет тривиально небольшого количества объектов).
В статье Википедии стандартные методы в значительной степени обобщены (и в C # тоже!) ). Я использовал и призраков, и держателей ценностей, и они работают довольно хорошо.
Чтобы реализовать этот вид техники, убедитесь, что вы строго разделяете проблемы. На сервере классы реализации вашего контракта на обслуживание должны быть единственными частями кода, которые работают с контрактами на данные. На клиентском уровне доступ к сервису должен быть единственным кодом, который работает с прокси. Р>
Подобные уровни позволяют настраивать способ реализации службы относительно независимо от уровней пользовательского интерфейса, вызывающих службу, и бизнес-уровня, который вызывается. Это также дает вам половину шансов на юнит-тестирование!
Другие советы
Не выполняйте отложенную загрузку через интерфейс службы. Определите явные DTO и используйте их как свои контракты с данными в WCF.
Вы можете использовать NHibernate (или другие ORM) для правильного извлечения объектов, необходимых для создания DTO.
Вы можете попытаться использовать что-то на основе REST (например, ADO.NET Data Services ) и прозрачно оберните его в код своего клиента.