Я успешно реализовал Ninject в приложении MVC3, но у меня возникли некоторые проблемы, связанные с веб-формами ASP.NET. Я получаю нулевые ссылки каждый раз, когда пытаюсь получить доступ к внедренному свойству на бизнес-уровне. После установки точек останова в методе CreateKernel, а также в нескольких местах в классе ServiceLocator создается впечатление, что ни одно из них никогда не получает удар, поэтому он даже не загружается.
Я уверен, что я просто подхожу к этому неправильно, но там очень мало документации или информации для подключения Ninject в приложении Web Forms.
В основном вот что у меня есть:
код позади
public class ReviewManager
{
[Inject] private IReviewRepository _reviewRepository { get; set; }
public ReviewManager() { }
public ReviewManager(IReviewRepository reviewRepository)
{
_reviewRepository = reviewRepository;
}
public Review GetById(int id)
{
if (id <= 0) throw new ArgumentException("ID must be greater than zero");
**I get a null reference exception on the next line. _reviewRepository is null**
return _reviewRepository.GetById(id);
}
}
Global.asax.cs
public class Global : NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
return ServiceLocator.Kernel;
}
// deleted for brevity
}
ServiceLocator.cs (отредактировано для краткости, соответствующие части здесь)
public static class ServiceLocator
{
public static IKernel Kernel { get; set; }
public static ILogger Logger { get; set; }
static ServiceLocator()
{
Kernel = new StandardKernel(new INinjectModule[] {
new LoggerBindings(),
new DataBindings()
});
if (Logger == null)
Logger = Kernel.Get<ILogger>();
}
}
public class LoggerBindings : NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<NLogLogger>();
}
}
public class DataBindings : NinjectModule
{
public override void Load()
{
Bind<IReviewRepository>().To<ReviewRepository>();
}
}