Я устанавливаю свойство на Request.Properties
внутри DelegatingHandler
после того, как я вырву некоторые данные из заголовка входящего запроса в веб-API.Как получить доступ к Request.Properties за пределами Web API-контроллера
Все это работает нормально. Я также могу получить доступ к Request.Properties
как внутри контроллера, так и в моих фильтрах «Действие» и «Исключение». Однако мне также необходимо получить доступ к этим данным из-за пределов контроллера (я называю класс бизнес-уровня с контроллера). Это данные, которые я хочу включить в некоторые журналы в других местах,
Я могу видеть HttpContext.Current
из этого класса, и я могу видеть исходный заголовок отсюда, поэтому, я думаю, я мог бы вырвать его снова, но поскольку у меня есть уже сделал это и поместил его в Свойства, кажется, имеет смысл получить его оттуда. Однако, похоже, у меня нет доступа к Request.Properties из другого места.
Если это неправильный способ сделать это, как еще я могу обойти эти данные для каждого запроса, чтобы он был доступен из любой точки стека в веб-API?
Используйте что-то вроде [AutoFac] (http://autofac.org/) для DI (инъекция зависимостей). У меня есть хороший пример. На самом деле я просто ответил на днях [здесь] (http://stackoverflow.com/a/35826744/1260204) (* Извините за бесстыдную вставку моего ответа *). Если вы перейдете в «Решение 2 - IoC/DI», вы можете его повторно использовать. Обновите класс 'WebUserInfo' (в верхней части ответа) и поместите интерфейс по своему усмотрению. Добавьте инфраструктуру Autofac. И теперь добавьте свой интерфейс 'IUserInfo' в конструкторы вашего уровня сервиса, Autofac позаботится обо всем остальном, и теперь у вас есть доступ, где вам это нужно. – Igor
Обратите внимание, что если вы вырвите из «HttpContext.Current», код будет работать только при работе в IIS. Используя OWIN для самостоятельного размещения веб-api, нет «HttpContext.Current» (если ваше приложение не устанавливает его вручную). – danludwig
Забыл упомянуть: вам также нужно будет зарегистрировать свои типы услуг с помощью рамки DI, и они могут быть введены в ваши веб-контроллеры api.Если вы используете несколько проектов, убедитесь, что общие интерфейсы определены в центральном расположении. Но ситуации, подобные этому, - это то, где действительно сияет инфраструктура DI. – Igor