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

Max*_*lov 5 inversion-of-control webactivator asp.net-mvc-3

我有几个WebActivator.PreApplicationStartMethod修饰类.

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

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

我的问题是:

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

Ric*_*ett 16

是的,您可以拥有任意数量的类,这些类具有WebActivator.PreApplicationStartMethod指向它们的程序集属性.许多NuGet包使用这种技术使它们能够在不编辑Global.asax的情况下引导到您的应用程序中.

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

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

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

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

  • 值得一提的是,需要使用WebActivatorEx包而不是WebActivator. (2认同)

mar*_*ind 1

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

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