Мы разрабатываем службу веб-API RESTful для обеспечения доступа к общим данным всем приложениям нашего предприятия. Чтобы помочь нам также опубликовать API-интерфейс клиента, который инкапсулирует все детали HttpClient и предоставляет строго типизированный доступ к данным.
Наша цель - начать небольшие и постепенно добавлять функции, сохраняя при этом обратную совместимость с уже развернутыми версиями клиентского API (совместимость с клиентами той же основной версии)
Говоря о дизайне, наша команда просто очень долго обсуждала , нужно ли делиться типами между сервером и клиентом (например, через пакеты NuGet с версией, которые как сервер, так и клиент будет зависеть от), и в конечном итоге с плюсами и минусами... и мы не можем так или иначе решить.
Типы общего доступа (совместная сборка) между клиентом и сервером
Pros
- Модель клиента и модель сервера всегда обновляются
- отсутствие сериализации/десериализации проблем, поскольку одни и те же типы сериализуются/десериализируются
- нет дублирования
против
- необходимо найти способ совместного использования типов между сервером и клиентом.
- не семантические модификации могут нарушать существующие клиентские приложения (изменение имени класса или его пространства имен в модели сервера), хотя оно не влияет на сериализованный json и поэтому не должно иметь никакого воздействия.
- риск взлома клинта без осознания
Отдельные (но структурно эквивалентные) типы для клиента и сервера
Pros
- клиентская "модель" менее связана с реализацией сервера (просто зеркало вывода Json на сервере, но не имеет отношения "такого же типа" )
- модель сервера может развиваться без риска взлома любого клиента
- позволяют улучшить клиентскую модель независимо от модели сервера.
- клиентская модель является частью клиентского пакета, а не "общим пакетом" для обслуживания между сервером и клиентом.
против
- дублирование между кодом сервера и кодом клиента
- подверженная ошибкам задача сохранения синхронизации на стороне сервера и клиентской стороне.
Кажется, предпочтение 50/50 для каждого решения в нашей команде.
Я лично предпочитаю второй вариант, потому что я считаю, что RESt - это развязка, а развязка означает, что клиент не должен заботиться о том, как реализована серверная сторона (какие типы, или же это приложение .NET в любом случае), но хотелось бы, чтобы мы могли избавиться от возможного дублирования, возможно, благодаря генерации кода или что-то в этом роде, но не смогли найти никаких указаний по этому вопросу
Существуют ли другие плюсы и минусы для совместного использования типов между клиентом и сервером?
Если мы не используем их, существуют способы снизить затраты на обслуживание при попытке сохранить модель клиента и модель сервера