Передача контекста клиента с использованием Unity в приложении-службе WCF - PullRequest
0 голосов
/ 12 октября 2011

У меня есть приложение-служба WCF (фактически, оно использует предварительный просмотр WCF Web API 5), которое перехватывает каждый запрос и извлекает несколько значений заголовка, переданных от клиента.Идея состоит в том, что «перехватчик» извлечет эти значения и настроит объект ClientContext, который затем будет глобально доступен в приложении на время запроса.Сервер не имеет состояния, поэтому контекст для каждого вызова.

Моя проблема в том, что приложение использует IoC (Unity) для внедрения зависимостей, поэтому нет использования синглтонов и т. Д. Любой класс, которому нужно использоватьконтекст получает его через DI.

Итак, как мне «динамически» создать новый объект контекста для каждого запроса и убедиться, что он используется контейнером во время этого запроса?Я также должен быть уверен, что он полностью поточно-ориентирован, так как каждый запрос действительно использует правильный экземпляр.

ОБНОВЛЕНИЕ

Так что я понимаю, когда смотрю напредложения ниже этой части моей проблемы - инкапсуляция.Идея состоит в том, что интерфейс, используемый для контекста (IClientContext), содержит только свойства только для чтения, поэтому оставшаяся часть кода приложения не может вносить изменения.(И в среде групповой разработки, если код позволяет это, кто-то неизбежно сделает это.)

В результате в моем обработчике сообщений, который перехватывает запрос, я могу получить экземпляр типа, реализующегоинтерфейс из контейнера, но я не могу его использовать.Я все еще хочу предоставить доступ к интерфейсу только для чтения для всего остального кода, но мне нужен способ установить значения свойств.Любые идеи?

Я рассматриваю реализацию двух интерфейсов, один из которых обеспечивает доступ только для чтения, а другой позволяет мне инициализировать экземпляр.Или приведение разрешенного объекта к типу, который позволяет мне устанавливать значения.К сожалению, это тоже не является надежной защитой, но если у кого-то нет лучшей идеи, это может быть лучшее, что я могу сделать.

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Чтение Блог Эндрю Оукли, посвященный конкретным менеджерам времени жизни WCF . Он создает UnityOperationContextLifetimeManager:

мы пришли к идее создать менеджер жизни Unity, привязанный к WCF's OperationContext. Таким образом, наши объекты-контейнеры будут жить только на время существования запроса ...

Сконфигурируйте свой контекстный класс с помощью этого менеджера времени жизни, а затем просто разрешите его. Это должно дать вам «операцию синглтон».

0 голосов
/ 13 октября 2011

Похоже, вам нужен Unity LifetimeManager. См. этот SO вопрос или эту статью MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...