Инъекция RoleProvider с помощью Ninject

Во-первых, я хочу сказать, что есть масса ответов на SO и поиски в Google, связанные с этим, однако я столкнулся с проблемой, которая мешает этим решениям работать. Ответ здесь кажется таким идти. (kernel.Inject(Roles.Provider);)

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь внедрить RoleProvider Roles.Provider, он равен нулю, однако мой пользовательский провайдер находится в списке внутри Roles.Providers. Я думаю, что Ninject слишком рано пытается получить доступ к поставщику ролей.

В моем классе NinjectWebCommon кажется, что он использует WebActivator для запуска самого себя. [assembly: WebActivator.PreApplicationStartMethod(typeof(Admin.App_Start.NinjectWebCommon), "Start")]

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

Я использую атрибут [Inject] в своем пользовательском провайдере.


person The Muffin Man    schedule 01.04.2014    source источник


Ответы (1)


Конвейер WebActivator запускается задолго до создания стандартного стека ASP.NET. Это означает, что у вас не будет доступа ни к чему, созданному ASP.NET во время начальной загрузки в NinjectWebCommon.

Используйте этот файл только для объявления привязок, которые не зависят от компонентов ASP.NET. Чтобы обойти эту проблему, вы должны использовать обработчик Global.asax Application_Start для загрузки любых дополнительных модулей/привязок, которые зависят от вещей ASP.NET, таких как Roles.Provider.

Вот предложение, которое может решить вашу проблему:

public void Application_Start()
{
    var kernel = (new Bootstrapper()).Kernel;
    kernel.Inject(Roles.Provider);

    //Other initialization stuff
}

Класс Bootstrapper — это ленивый синглтон, который имеет статический IKernel, инициализированный в вашем NinjectWebCommon.cs. Таким образом, это правильный способ получения сконфигурированного экземпляра ядра вне вашего NinjectWebCommon.

Попробуйте.

person cvbarros    schedule 02.04.2014