2012-01-27 188 views
5

我有幾個WebActivator.PreApplicationStartMethod裝飾類。定義WebActivator.PreApplicationStartMethod類的初始化順序

一個是Ninject,AwesomeMVC的另一個類,第三個是後臺任務調度程序。

問題是調度程序類需要利用IoC容器解決的依賴關係。

我的問題是:

  1. 我能有幾個WebActivator.PreApplicationStartMethod類?
  2. 我可以定義它們的初始化順序嗎?這樣IoC最重要嗎?
  3. WebActivator.PreApplicationStartMethod靜態類實例是否依賴IoC容器來解析其構造函數定義的依賴關係?

回答

1

如果你知道PreAppStart方法的需要PreAppStart方法B之後運行,那麼唯一的辦法才達到即明確添加通話A.

身體內部到B對於戰略,你應該確保你的PreAppStart方法實現是不具有獨立性的,即它們可以安全地被多次調用。通常這可以通過跟蹤該方法是否已經在一個靜態布爾變量中被調用來實現,並且如果該值爲真則不做任何事情。

+0

你是說即使我有一個PreAppStat方法,它可以多次調用?爲什麼這樣? – 2012-01-28 00:19:49

+1

框架只會調用一次該方法。但是,假設你有3個組件:A,B和C.A和B都依賴於C(因此按照這個準則,它們都在它們自己的方法中調用C的PreAppStart方法)。但是A和B是獨立的,彼此不瞭解,所以不能協調C的PreAppStart方法被調用的次數。這就是爲什麼C的方法需要是冪等的。 – marcind 2012-01-29 01:23:14

+0

哦,我明白了。謝謝。 – 2012-01-29 20:15:11

12

是的,您可以擁有任意數量的類,只要您有一個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類是靜態類,我看不出你如何使用構造器注入其中。然而,您可以使用服務定位器(反?) - 模式,將您的IoC解析器註冊爲Mvc的默認服務定位器,使用System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver)

雖然我不特別想進入服務定位器模式的優點和缺點!

+1

值得一提的是,需要使用WebActivatorEx軟件包代替WebActivator。 – Vitaly 2014-07-20 15:33:14