Asp.net mvc 3 定义WebActivator.PreApplicationStartMethod类的初始化顺序

Asp.net mvc 3 定义WebActivator.PreApplicationStartMethod类的初始化顺序,asp.net-mvc-3,inversion-of-control,webactivator,Asp.net Mvc 3,Inversion Of Control,Webactivator,我有几个WebActivator.PreApplicationStartMethod类 一个用于Ninject,另一个用于AwesomeMVC,第三个用于后台任务调度器 问题是调度器类需要利用IoC容器解决的依赖关系 我的问题是: 我可以有几个WebActivator.PreApplicationStartMethod类吗 我可以定义它们初始化的顺序吗?这样,IoC作为最重要的,就排在第一位了 WebActivator.PreApplicationStartMethod静态类实例能否依赖IoC容

我有几个WebActivator.PreApplicationStartMethod类

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

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

我的问题是:

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

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


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

    是的,您可以拥有任意多个类,这些类具有指向它们的
    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.dependencysolver.SetResolver(idependencysolver-resolver)将IoC解析器注册为Mvc的默认服务定位器来使用服务定位器(anti?)模式


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

    你是说即使我有一个PreAppStat方法,它也会被调用多次?为什么会这样?框架只调用该方法一次。但是假设您有3个组件:A、B和C。A和B都依赖于C(因此根据本指南,它们都在各自的方法中调用C的PreAppStart方法)。但是A和B是独立的,彼此不了解,因此无法协调C的PreAppStart方法被调用了多少次。这就是为什么C的方法需要是幂等的。您可以对它进行排序(参见其他注释)。在WebActivator属性中使用“Order”参数值得一提的是,需要使用WebActivatorEx包而不是WebActivator。