【问题标题】:Define an initialization order of WebActivator.PreApplicationStartMethod classes定义 WebActivator.PreApplicationStartMethod 类的初始化顺序
【发布时间】:2012-01-27 23:42:47
【问题描述】:

我有几个 WebActivator.PreApplicationStartMethod 装饰类。

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

问题在于调度程序类需要利用依赖项,这些依赖项由 IoC 容器解决。

我的问题是:

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

【问题讨论】:

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


    【解决方案1】:

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

    您也可以定义顺序。您可以在 PreApplicationStartMethod 调用中传递命名参数 Order。 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 的默认服务定位器来使用服务定位器(反?)模式。

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

    【讨论】:

    • 值得一提的是,需要使用 WebActivatorEx 包而不是 WebActivator。
    【解决方案2】:

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

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

    【讨论】:

    • 你是说即使我有一个 PreAppStat 方法,它也可以被多次调用?为什么会这样?
    • 框架只会调用该方法一次。但是假设您有 3 个组件:A、B 和 C。A 和 B 都依赖于 C(因此根据本指南,它们都在自己的方法中调用 C 的 PreAppStart 方法)。但是 A 和 B 是独立的,彼此不知道,因此无法协调 C 的 PreAppStart 方法被调用了多少次。这就是为什么C的方法需要是幂等的。
    • 你可以订购它(见其他评论)。在 WebActivator 属性中使用“Order”参数
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多