Это применение закона Postel's, «быть консервативным в том, что вы делаете, быть либеральным в том, что вы принимаете от других».
Проверки равенства могут выполняться независимо от типа ; метод equals
определен в классе Object
и принимает любой параметр Object
в качестве параметра. Таким образом, имеет смысл эквивалентность ключей и операции, основанные на эквивалентности ключей, для принятия любого типа Object
.
Когда карта возвращает значения ключа, она сохраняет как можно больше информации о типе, используя ее параметр типа.
Для (1) общим вариантом использования будет клиент, который взаимодействует с одним сервером. Возможно, это интерфейс API, который был создан для использования этим клиентом. Точные данные будут храниться в файле конфигурации, который клиент читает во время запуска.
Мы могли бы заманить наш код прямым доступом к конфигу или ввести строку, считанную из config, в каждое место, которое необходимо построить полный URL. Или мы могли бы просто сконфигурировать BaseAddress
HttpClient, который мы помещаем в наш контейнер Injection Dependency, и просто позволить местам потребления иметь этот объект. Это для меня несколько ожидаемый прецедент.
Для (2) я не думаю, что существует техническое ограничение. Я думаю, что это больше для спасения людей от самих себя. Поскольку установка BaseAddress
и выполнение фактического запроса для выхода через, например, GetAsync
являются отдельными действиями, было бы небезопасно, чтобы два отдельных фрагмента кода делали такую вещь одновременно - вы могли легко получить гонки. Поэтому легче рассуждать о многопоточных программах, которые могут совместно использовать один экземпляр HttpClient
, если такие расы не разрешены в первую очередь.
2 цели:
GetAsync
и т. Д. Является потокобезопасным, HttpClient
имеет несколько свойств в дополнение к BaseAddress
, например DefaultRequestHeaders
, которые не являются. Как правило, вы хотите, чтобы они были одинаковыми для вызовов одного и того же хоста, но не для вызовов на разные. По этой причине экземпляр HttpClient
на вызываемый хост фактически является очень хорошей практикой. Если вы не вызываете тысячи разных хостов, вам не нужно беспокоиться о проблемах, связанных с нарушением надзора . (И даже если бы вы использовали одноэлементный режим, базовому сетевому стеку в любом случае нужно было бы открыть другой сокет на хост.) Итак, почему нужно указать полный адрес при вызове HttpClient
даже работать вообще? Опять же, удобство. Адрес может исходить от внешнего источника или ввода пользователя, и вы не захотите его разбивать на части, чтобы использовать его. Но в этом случае вы находитесь на крюке для обеспечения безопасности потоков, и те, которые не являются потокобезопасными свойствами, вероятно, просто должны быть полностью исключены.
HttpClient
сBaseAddress
вместо одного для всех запросов? – Jerome Reinländer 13 July 2018 в 08:42