Как внедрить зависимости в HttpModule с ninject? - PullRequest
9 голосов
/ 11 июля 2011

Мы работаем над проектом webforms в моей компании, и у меня есть HttpModule, для которого мне нужно разрешить зависимости.

Мы используем библиотеку Ninject.Web для разрешения зависимостей для главных страниц, страниц, пользовательских элементов управления,веб-сервисы и HttpHandlers.Все они имеют базовые классы, которые вы можете наследовать в пространстве имен Ninject.Web:

  • MasterPageBase
  • PageBase
  • WebServiceBase
  • HttpHandlerBase
  • И пользовательский, который мы добавили, так как по какой-то странной причине его там не было: UserControlBase

Однако я не могу найти HttpModuleBase.Существует NinjectHttpModule, но это не базовый класс, это реальный модуль, который пытается устранить необходимость наследования от базовых классов на страницах и в пользовательских элементах управления, но в нем есть некоторые ошибки, и мы его не используем.

Как лучше всего разрешить мои зависимости в моем HttpModule?

Когда я захожу в Google, я задаю этот вопрос на первой странице -_-

Ответы [ 2 ]

12 голосов
/ 21 сентября 2011

Фил Хаак написал в блоге о том, как это сделать, что позволяет использовать инжектор конструктора и, таким образом, избегать зависимости вашего модуля HttpModule напрямую от Ninject.В стандартном NinjectHttpApplication выполните следующие действия:

Шаг 1

Используйте Nuget, чтобы найти и добавить пакет HttpModuleMagic в свой веб-проект.

Шаг 2

Напишите HttpModule, чтобы использовать инжектор конструктора:

public class MyHttpModule : IHttpModule
{
    public MyHttpModule(ISomeService someService) {...}
}

Шаг 3

Удалите модуль http из вашего web.config:

<httpModules>
    <!-- Modules will be defined via DI bindings -->
</httpModules>

Шаг 4

Настройка привязок:

Bind<IHttpModule>().To<MyHttpModule>();
// Repeat the pattern above for any other modules.
3 голосов
/ 12 июля 2011

Я немного удивлен, что никто не ответил на это весь день! Похоже, я поставил вас в тупик:)

Ну, я решил проблему. Я написал свою собственную реализацию IHttpModule и сам скомпилировал ее в сборку Ninject.Web. Вот источник базового класса, который я добавил:

namespace Ninject.Web
{
    public class HttpModuleBase : IHttpModule
    {
        /// <summary>
        /// This method is unused by the base class.
        /// </summary>
        public virtual void Dispose()
        {

        }

        /// <summary>
        /// Ininitialize the module and request injection.
        /// </summary>
        /// <param name="context"></param>
        public virtual void Init(HttpApplication context)
        {
            RequestActivation();
        }

        /// <summary>
        /// Asks the kernel to inject this instance.
        /// </summary>
        protected virtual void RequestActivation()
        {
            KernelContainer.Inject(this);
        }
    }
}

Я просто смоделировал его после других базовых классов в сборке Ninject.Web. Похоже, работает чудесно. Просто сделайте ваш HttpModule унаследованным от Ninject.Web.HttpModuleBase, и тогда вы сможете использовать инъекцию свойств в вашем модуле, например:

public class AppOfflineHttpModule : HttpModuleBase
{
    [Inject]
    public IUtilitiesController utilitiesController { get; set; }

    ...
}
...