Castle.Windsor и HttpContextWrapper - PullRequest
       34

Castle.Windsor и HttpContextWrapper

1 голос
/ 29 марта 2011

HttpContextWrapper и HttpContextBase, как объяснено здесь , были введены, чтобы сделать HttpContext более поддающимся моделированию / тестируемым.

Я пытаюсь использовать его с S # arp Architecture и пытаюсь решить некоторые проблемы.

Мои контроллеры MVC настроены на прием аргумента HttpContextBase в конструкторе, и во время Application_Start HttpContextBase регистрируется в Castle.Windor следующим образом:

container.Register(Component.For<HttpContextBase>().UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));

Казалось, это немного сработало, но потом я понял, что Касл только один раз запускает этот метод Factory, поэтому все запросы получают исходный HttpContextWrapper. На самом деле его нужно заново создавать для каждого запроса. Команда Castle.Windsor для этого будет:

container.Register(Component.For<HttpContextBase().
    LifeStyle.PerWebRequest.UsingFactoryMethod(
    () => new HttpContextWrapper(HttpContext.Current)));

... но оказывается, что Castle.Windsor не позволяет использовать LifeStyle.PerWebRequest в Application_Start (, как описано здесь )

Что мне делать? Есть ли простой способ обойти это или я должен отказаться от HttpContextWrapper и внедрить свою собственную фабрику, чтобы сделать новые по мере необходимости?

Ответы [ 3 ]

8 голосов
/ 29 марта 2011

Мои контроллеры MVC настроены на прием аргумента HttpContextBase в конструкторе

Вы должны что-то делать крайне неправильно здесь, поэтому остановитесь, пока не стало слишком позднои был причинен ущерб (материальные, моральные и человеческие жертвы :-)).У вас уже есть HttpContext внутри контроллера.

Не регистрируйте никакие HttpContexts в вашей структуре DI.Обработка HttpContext - это работа ASP.NET.

2 голосов
/ 29 марта 2011

Как отметил Дарин, нет смысла вставлять HttpContext в контроллер MVC.Однако, если вам это нужно для других видов услуг, а также в Application_Start (), используйте гибридный perwebrequest-переходный образ жизни .Или, поскольку сборка проста, просто сделайте ее переходной.

0 голосов
/ 30 марта 2011

Как уже говорили другие - вы делаете это неправильно. Мой большой вопрос:

Что вы делаете, что требует, чтобы вы вставили HttpContextBase в ваш контроллер? Для людей, желающих помочь вам, было бы более полезно, если бы вы предоставили нам больше информации о том, что вы действительно пытаетесь сделать. Давайте возьмем Касла из него и приступим к тому, что делает ваш контроллер.

Кстати, ваш контроллер уже имеет ссылку на HttpContext. Если вы делаете это для тестируемости, вам ничего не нужно делать на уровне контроллера. Вам просто нужно смоделировать объект HttpContextBase, как необходимо в тестах вашего контроллера.

...