gpt4 book ai didi

c# - 我可以将某些东西注入(inject)到 MvcApplication 中吗?

转载 作者:行者123 更新时间:2023-11-30 16:58:45 25 4
gpt4 key购买 nike

我正在使用带有 Ninject 3 的 ASP.NET MVC 5。

我想在网站启动时运行一些代码,这将从数据库中提取一些内容。我已经设置了注入(inject),它在项目的其他地方运行良好。

我将 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 属性始终为 null。我从另一个类中复制了这两行(Inject 属性和属性声明),它们工作正常。

我在这个方法和 NinjectWebCommon 类的 RegisterServices 方法中放了一些 Debug.WriteLine 语句,我可以看到在我尝试使用该服务之前已注册服务,所以这不是问题所在。

有人知道为什么这总是 null 吗?

最佳答案

MvcApplication 的实例由 ASP.Net 为您创建,Ninject 无法自动注入(inject)该属性。

正如您提到的,注入(inject)在您的 MVC 应用程序的其他地方工作,我假设您正在使用一个包含 NinjectWebCommon 的 Nuget 包,以及 MVC 应用程序中 DI 所需的所有管道。 NinjectWebCommon 将在 Application_Start 事件之前运行,因为它可能会注册一个 PreApplicationStartMethod。除了注册您的依赖项之外,它还配置了一个 IDependencyResolver用于幕后的 MVC。

因此您可以在 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参见 this other SO questionread this article .

这意味着您可以以 HttpApplication 类的实例结束,其中服务和公司都为空。如果您只想让公司启动应用程序并让该对象在后续事件中可用,我会将 VoucherCompany 设置为静态,在 Application_Start 上填充它,甚至不会费心保存对服务。 (根据您想要实现的目标,可能会有更好的选择。)

希望对您有所帮助!

关于c# - 我可以将某些东西注入(inject)到 MvcApplication 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com