Asp.net mvc 3 定义WebActivator.PreApplicationStartMethod类的初始化顺序
我有几个WebActivator.PreApplicationStartMethod类 一个用于Ninject,另一个用于AwesomeMVC,第三个用于后台任务调度器 问题是调度器类需要利用IoC容器解决的依赖关系 我的问题是: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容
如果您知道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。