Я пытаюсь создать шаблон конечной точки для веб-службы.Мое основное требование заключается в том, чтобы вызывающая сторона могла указать, какие свойства должны быть заполнены в возвращенном наборе результатов.
Мой сервис возвращает большие списки (до 1М записей) частичных объектов, а также отдельные полные объекты, такие как(грубый пример XML, извините, он немного многословен)
Список:
<items>
<item>
<a>aaa</a>
<b>bbb</b>
</item>
<item>
<a>aaaA</a>
<b>bbbB</b>
</item>
</items>
Подробно:
<item>
<a>aaa</a>
<b>bbb</b>
<c>ccc</c>
...
<w>
<x>xxx</x>
<y>yyy</y>
</w>
<z>zzz</z>
</item>
Я рассмотрел следующие идеи:
- Возвращение подробных элементов списка
- Создание типа элемента 'список', который короче
- , передавая строковый массив имен свойств, которые вызывающая сторона хочет вернуть
Я склоняюсь к 3-му варианту, но хочу что-то другое, поскольку он не поддерживает подобъекты, я рассмотрел передачу XML-схемы, которую вы хотите вернуть вместо массива.
Мне бы хотелось, чтобы API поддерживал отложенную загрузку, поэтому третий способ также выглядит жизнеспособным.
Вот пример того, как будет выглядеть функция для 3.:
public User GetUser(long ID, string[] properties)
И тогда вызывающий абонент может просто пойти:
User.Email = GetUser(User.ID, "Email").Email
Благодаря широкому использованию значений по умолчанию и скрытию пустых значений, возвращаемый XML для этого будет:
<User>
<ID>123</ID>
<Email>example@example.com</Email>
</User>
Теперь проблема, как упомянуто выше, состоит в том, чтобы попытаться заставить его хорошо играть с такими вещами, как <w>
намного выше, который сам имеет подпункты, а также возможность для списков иметь подпункты.
Поскольку у меня далекослишком много свойств, я не могу иметь только метод ws для каждого свойства.
Я рассматриваю вариант 3. но использую XML-схему вместо string[]
.. Но я не могу придумать простой способчтобы определить это, я также хотел бы не использовать строковые имена для таких свойств, как "Email"
.
. Окончательный план состоит в том, чтобы иметь серию предопределенных схем, которые используются обычно и только в расширенной версии.В случаях, когда мы действительно должны определить запрошенные свойства.Но я не имею представления обо всех системах, которые будут взаимодействовать с моим API, не говоря уже о том, какие свойства они могут пожелать (нам не удастся адаптировать API для каждого вызывающего абонента).
Илия слишком много усложняю?