我可以插入一些东西到mvapplication吗?
本文关键字:mvapplication 插入 我可以 | 更新日期: 2023-09-27 18:13:22
我正在使用ASP。. NET MVC 5,使用Ninject 3.
我想有一些代码运行时,网站开始,这将从数据库拉一些东西。我已经设置了注入,它在项目的其他地方工作得很好。
我改变了Global.asax
文件,看起来像这样…
[Inject]
public VoucherCompanyServiceLogicInterface VoucherCompanyServiceLogic { get; set; }
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
VoucherCompany vc = VoucherCompanyServiceLogic.GetByID(1, 1);
}
…但VoucherCompanyServiceLogic
的性质总是空的。我从另一个类复制了这两行(Inject
属性和属性声明),它们工作得很好。
我在这个方法中放入了一些Debug.WriteLine
语句,在NinjectWebCommon
类的RegisterServices
方法中,我可以看到在我尝试使用这个之前服务正在被注册,所以这不是问题。
有人知道为什么这个总是null吗?
MvcApplication
实例是由ASP为您创建的。Net时,Ninject无法自动注入该属性。
当您提到注入在MVC应用程序的其他地方工作时,我假设您正在使用一个Nuget包,其中包含一个NinjectWebCommon
,其中包含MVC应用程序中DI所需的所有管道。NinjectWebCommon
将在Application_Start
事件之前运行,因为它可能注册PreApplicationStartMethod
,除了注册您的依赖关系外,它还在幕后为MVC配置IDependencyResolver
。
所以你可以在Application_Start
方法中使用依赖解析器来获得该服务的实例:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
VoucherCompanyServiceLogic = DependencyResolver.Current.GetService<IVoucherCompanyServiceLogicInterface>();
if(VoucherCompanyServiceLogic != null)
{
VoucherCompany vc = VoucherCompanyServiceLogic.GetByID(1, 1);
}
}
但是你打算用VoucherCompany
实例做什么?你知道MvcApplication
的多个实例可能是由ASP创建的吗?Net, Application_Start
将不会为每个实例调用?查看其他SO问题或阅读这篇文章。
这意味着您可以以HttpApplication类的实例结束,其中服务和公司都为空。如果您只想在应用程序启动时获得公司,并在随后的事件中使用该对象,那么我会将VoucherCompany
设置为静态,在Application_Start上填充它,甚至不需要保存对服务的引用。(根据你想达到的目标,可能有更好的选择。)
希望有帮助!