У меня есть приложение ASP.NET 3.5 WebForms, использующее Ninject 2.0. Однако, пытаясь использовать расширение Ninject.Web для обеспечения внедрения в System.Web.UI.Page, я получаю нулевую ссылку на мою внедренную зависимость, даже если я переключаюсь на использование локатора службы для предоставления ссылки (используя Ninject ) нет проблем.
Моя конфигурация (из-за простоты):
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>();
Чего мне не хватает?
[Update] Наконец-то вернулись к этому, и он работает в режиме 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.Web.PageBase - что бы ни возникло первым).