6

我有几个 WebActivator.PreApplicationStartMethod 装饰类。

一个用于 Ninject,另一个用于 AwesomeMVC,第三个用于后台任务调度程序。

问题是调度程序类需要利用 IoC 容器解决的依赖关系。

我的问题是:

  1. 我可以有几个 WebActivator.PreApplicationStartMethod 类吗?
  2. 我可以定义初始化它们的顺序,以便最重要的 IoC 排在第一位吗?
  3. WebActivator.PreApplicationStartMethod 静态类实例能否依赖 IoC 容器来解决其构造函数定义的依赖关系?
4

2 回答 2

17

是的,您可以拥有任意数量的类,这些类具有WebActivator.PreApplicationStartMethod指向它们的程序集属性。许多 NuGet 包使用此技术使它们能够引导到您的应用程序,而无需编辑 Global.asax。

您也可以定义顺序。Order您可以在PreApplicationStartMethod调用中传递命名参数。WebActivator 框架将确保按指定的顺序调用方法。例如,要先注册您的 IoC 框架,请执行以下操作:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.NinjectWebCommon), "Start", Order=1]
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.BGScheduler), "Start", Order=2]

因为WebActivator类是静态类,我看不出如何在其中使用构造函数注入。但是,您可以通过将 IoC 解析器注册为 Mvc 的默认服务定位器来使用服务定位器(反?)模式,使用System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver).

不过,我并不想在这里讨论服务定位器模式的优缺点!

于 2012-09-25T20:10:51.280 回答
1

如果您知道 PreAppStart 方法 A 需要在 PreAppStart 方法 B 之后运行,那么实现此目的的唯一方法是在 A 的主体内显式添加对 B 的调用。

为了使该策略正常工作,您还应该确保您的 PreAppStart 方法实现是幂等的,即可以安全地多次调用它们。通常这可以通过跟踪该方法是否已经在静态布尔变量中被调用并且如果该值是真的不做任何事情来实现。

于 2012-01-28T00:03:50.843 回答