我可以插入一些东西到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吗?

我可以插入一些东西到mvapplication吗?

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上填充它,甚至不需要保存对服务的引用。(根据你想达到的目标,可能有更好的选择。)

希望有帮助!