Ninject 未将服务注入 Web 窗体页面
Ninject not injecting service into Web Forms page
我试图在组合的 ASP.NET Web 窗体和 MVC 项目中将 Ninject 用于 DI。我通过 NuGet 安装了以下包(及其依赖项):
Ninject.MVC5 3.2.1.0
Ninject.Web 3.2.1.0
在~/App_Start/NinjectWebCommon.cs
我注册服务:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITermusRepository>().To<TermusOracleRepository>();
}
在 MVC 控制器中,我使用构造函数注入来检索我的 ITermusRepository
实现:
public class Appraisal2013_2014FullController : Controller
{
ITermusRepository repo { get; set; }
public Appraisal2013_2014FullController(ITermusRepository Repo)
{
repo = Repo;
}
}
MVC 工作得很好,我稍后在我的操作方法中使用 repo
来成功检索数据。一切都很好。
在 Web 窗体中,我使用属性注入。
public partial class _2013_2014_TERMUS_PaperTermus : BasePage
{
[Inject]
ITermusRepository repo { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
var appraisal = repo.LoadByTermusId<Termus2013_2014EndYear>(Request.QueryString["TERMUSID"]);
}
}
但是,repo.LoadByTermusId()
调用失败并显示 NullReferenceException
,因为 repo 为空。
System.NullReferenceException: Object reference not set to an instance
of an object.
显然 Ninject 至少对于 MVC 设置正确。我不明白为什么我的 ITermusRepository
实现没有被注入到我后面的 Web 窗体代码中。我该怎么做才能正确注入它?
我使用 Jason 在 How can I implement Ninject or DI on asp.net Web Forms? 中的回答作为我的工作模式。我不想使用 Joe 的回答,因为它需要修改全局应用程序 class 的基础 class、页面、母版页、ASMX 服务、通用处理程序等。这在当前看来是不必要的Ninject.
版本
[Inject]
ITermusRepository repo { get; set; }
需要
[Inject]
public ITermusRepository repo { get; set; }
这解决了我的 .aspx
Web 表单页面的问题。但它并没有将它们注入我的 .ashx
通用处理程序。因为我没有很多,所以我在我的处理程序中创建了一个构造函数 class 并从内核中检索服务。
ITermusRepository repo { get; set;}
public GetPDF()
{
var kernel = TERMUS.App_Start.NinjectWebCommon.CreateKernel();
repo = kernel.Get<ITermusRepository>();
}
我试图在组合的 ASP.NET Web 窗体和 MVC 项目中将 Ninject 用于 DI。我通过 NuGet 安装了以下包(及其依赖项):
Ninject.MVC5 3.2.1.0
Ninject.Web 3.2.1.0
在~/App_Start/NinjectWebCommon.cs
我注册服务:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITermusRepository>().To<TermusOracleRepository>();
}
在 MVC 控制器中,我使用构造函数注入来检索我的 ITermusRepository
实现:
public class Appraisal2013_2014FullController : Controller
{
ITermusRepository repo { get; set; }
public Appraisal2013_2014FullController(ITermusRepository Repo)
{
repo = Repo;
}
}
MVC 工作得很好,我稍后在我的操作方法中使用 repo
来成功检索数据。一切都很好。
在 Web 窗体中,我使用属性注入。
public partial class _2013_2014_TERMUS_PaperTermus : BasePage
{
[Inject]
ITermusRepository repo { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
var appraisal = repo.LoadByTermusId<Termus2013_2014EndYear>(Request.QueryString["TERMUSID"]);
}
}
但是,repo.LoadByTermusId()
调用失败并显示 NullReferenceException
,因为 repo 为空。
System.NullReferenceException: Object reference not set to an instance of an object.
显然 Ninject 至少对于 MVC 设置正确。我不明白为什么我的 ITermusRepository
实现没有被注入到我后面的 Web 窗体代码中。我该怎么做才能正确注入它?
我使用 Jason 在 How can I implement Ninject or DI on asp.net Web Forms? 中的回答作为我的工作模式。我不想使用 Joe 的回答,因为它需要修改全局应用程序 class 的基础 class、页面、母版页、ASMX 服务、通用处理程序等。这在当前看来是不必要的Ninject.
版本[Inject]
ITermusRepository repo { get; set; }
需要
[Inject]
public ITermusRepository repo { get; set; }
这解决了我的 .aspx
Web 表单页面的问题。但它并没有将它们注入我的 .ashx
通用处理程序。因为我没有很多,所以我在我的处理程序中创建了一个构造函数 class 并从内核中检索服务。
ITermusRepository repo { get; set;}
public GetPDF()
{
var kernel = TERMUS.App_Start.NinjectWebCommon.CreateKernel();
repo = kernel.Get<ITermusRepository>();
}