Внедрение Construtor / Setter с использованием IoC в HttpHandler, возможно ли это? - PullRequest
6 голосов
/ 19 августа 2010

Я столкнулся с довольно волосатой проблемой.Вероятно, есть простое решение, но я не могу его найти!

У меня есть пользовательский HttpHandler, который я хочу обработать запрос, зарегистрировать определенную информацию, а затем ввести данные в базу данных.Я использую NUnit и Castle Windsor.

Так что у меня есть два интерфейса;один для регистрации другой для ввода данных, которые вводятся конструктором.Я быстро обнаружил, что нет способа вызвать конструктор, так как вместо него всегда вызывается конструктор по умолчанию без параметров.

Так что я подумал, что буду использовать инъекцию Setter и позволить Castle windsor разобраться с этим.Это на самом деле работает, как когда я использую container.Resolve<CustomHttpHandler>();, я могу проверить, что регистратор не является нулевым.(В Application_Start в Global.asax.cs)

Проблема в том, что, хотя Castle Windsor может создать экземпляр, который приложение http не использует ???Я думаю, что ??

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Невозможно, по крайней мере, не напрямую.Объекты IHttpHandler создаются в среде выполнения ASP.NET, и это не позволяет Виндзору участвовать в его создании.Вы можете:

  • Извлечь зависимости, используя контейнер в качестве локатора службы.
  • Настроить базовый обработчик, который создает, внедряет и делегирует ваши собственные обработчики (см. Как Spring делает это )
  • Использование контейнера в качестве локатора службы для другой службы, которая обрабатывает весь запрос (как объяснено saret )
2 голосов
/ 19 августа 2010

Что вы могли бы сделать, это вызвать HttpHandler для другого объекта, который фактически обрабатывает запрос. поэтому в методе ProcessRequest вашего HttpHandler вы бы сделали что-то вроде этого:

public void ProcessRequest(HttpContext context)
{
 var myHandlerObject = container.Resolve<HandlerObject>();
 myHandlerObject.ProcessRequest(context or some state/info that is required)
}
...