定义WebActivator.PreApplicationStartMethod类的初始化顺序

时间:2012-01-27 23:42:48

标签: asp.net-mvc-3 inversion-of-control webactivator

我有几个WebActivator.PreApplicationStartMethod修饰类。

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

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

我的问题是:

  1. 我可以拥有多个WebActivator.PreApplicationStartMethod类吗?
  2. 我可以定义它们被初始化的顺序,以便最重要的IoC成为第一个吗?
  3. WebActivator.PreApplicationStartMethod静态类实例可以依赖IoC容器来解析构造函数定义的依赖关系吗?

2 个答案:

答案 0 :(得分:15)

是的,您可以拥有任意数量的类,其中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类是静态类,所以我看不到如何在其中使用构造函数注入。但可以使用服务定位器(反?) - 模式,使用System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver)将IoC解析器注册为Mvc的默认服务定位器。

我不是特别想在这里讨论服务定位器模式的优点和缺点!

答案 1 :(得分:1)

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

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