Ninject. Сеть. PageBase, все еще приводящий к нулевой ссылке к введенной зависимости

У меня есть ASP.NET 3.5 приложения WebForms с помощью Ninject 2.0. Однако пытаясь использовать Ninject. Веб-расширение для обеспечения инжекции в Систему. Сеть. UI.Page, я получаю нулевую ссылку к своей введенной зависимости даже при том, что, если я переключаюсь на использование сервисного локатора для обеспечения ссылки (использование Ninject), нет никакой проблемы.

Моя конфигурация (dumbed вниз для простоты):

public partial class Default : PageBase // which is Ninject.Web.PageBase
{
    [Inject]
    public IClubRepository Repository { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var something = Repository.GetById(1); // results in null reference exception.
    }
 }

...//global.asax.cs

public class Global : Ninject.Web.NinjectHttpApplication
{
    /// <summary>
    /// Creates a Ninject kernel that will be used to inject objects.
    /// </summary>
    /// <returns>
    /// The created kernel.
    /// </returns>
    protected override IKernel CreateKernel()
    {
        IKernel kernel =
        new StandardKernel(new MyModule());
        return kernel;

    }

..

...

public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind<IClubRepository>().To<ClubRepository>();
        //...
    }
}

Получение экземпляра бетона IClubRepository через сервисный локатор хорошо работает (использует тот же "MyModule"). Т.е.

  private readonly IClubRepository _repository = Core.Infrastructure.IoC.TypeResolver.Get<IClubRepository>();

Что я пропускаю?

[Обновление] Наконец возвратилось к этому, и оно работает в режиме Classic Pipeline, но не Интегрированное. Действительно ли классический конвейер является требованием?

[Обновите 2], Обеспечение электричеством моего OnePerRequestModule было проблемой (который удалил в вышеупомянутом примере для ясности):

    protected override IKernel CreateKernel()
    {
        var module = new OnePerRequestModule();
        module.Init(this);

        IKernel kernel = new StandardKernel(new MyModule());

        return kernel;
    }

... потребности быть:

    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new MyModule());

        var module = new OnePerRequestModule();
        module.Init(this);

        return kernel;
    }

Таким образом объяснение, почему я получал исключение нулевой ссылки под интегрированным конвейером (к Ninject ввел зависимость или просто загрузку страницы для страницы, наследовавшейся Ninject. Сеть. PageBase - независимо от того, что было на первом месте).

5
задан Ted 17 March 2010 в 20:39
поделиться

2 ответа

Это довольно загадочно, потому что, насколько я могу судить, похоже, что у вас все настроено правильно. Из-за того, что вы получаете исключение нулевой ссылки вместо ActivationException, может показаться, что внедрение на уровне страницы не происходит. Обычно это связано с уровнем защиты вводимого свойства, но, судя по вашему коду, проблем нет. Вот несколько вещей, которые вы можете попытаться выяснить, в чем заключается проблема:

  1. Вызов Kernel.Inject (this), который инициирует внедрение свойств для Ninject, выполняется в методе OnInit класса PageBase. Если по какой-то причине этот метод не выполняется, это может привести к проблеме, которую вы видите. Вы можете провести дополнительное исследование, переопределив метод RequestActivation (), который является методом, вызываемым для фактического внедрения (обязательно вызовите base.RequestActivation ()). Если ваше переопределение никогда не вызывается, значит, проблема с файлом OnInit.

  2. InjectAttribute настроен в конфигурации ядра по умолчанию, поэтому указывать его не нужно, однако, если вы хотите быть более уверенными, вы можете настроить отображение атрибутов в своем ядре, выполнив что-то вроде :

    IKernel kernel = new StandardKernel (new NinjectSettings {InjectAttribute = typeof (InjectAttribute)}, new MyModule ());

  3. Экземпляр ядра, используемый классом PageBase для внедрения (а также тот, который должен быть создан вашим переопределением CreateKernel в вашем Global.asax.cs) хранится в объекте типа локатора службы в Ninject.Web.KernelContainer. Я хотел бы убедиться, что вы видите свойство Kernel в KernelContainer и что оно не равно нулю из вашего метода Page_Load.

Это все, что у меня есть на данный момент, что касается понимания. Как я уже сказал, отсюда следует, что вы одели всех своих уток и поставили их рядами, так что они должны работать ....

Удачи в поиске проблемы.

2
ответ дан 15 December 2019 в 06:24
поделиться

Возможно, это не относится к Ninject. Я могу получить такое же исключение, работая в интегрированном режиме без IoC. У меня простое приложение asp.net, которое содержит одну aspx-страницу без логики.

В моем файле global.asax есть следующее:

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        this.EndRequest += new EventHandler(Global_EndRequest);
    }

    void Global_EndRequest(object sender, EventArgs e)
    {
        // do stuff
    }

В основном подписка на событие в application_start вызывает это исключение при запуске в режиме интегрированного конвейера. Переключение на классический конвейер или удаление подписки на событие и обработчика приводит к исчезновению ошибки. Я использую IIS 7.5 на Win7 Enterprise 64bit.

Это может не решить вашу конкретную проблему, но я пишу здесь, так как это единственная страница, которая появилась, когда я вставил исключение в google! Я перенесу свой ответ в отдельный вопрос, когда мне разрешат его задать. У меня пока нет кудо на stackoverflow :(

1
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: