2014-07-18 44 views
3

我正在使用ASP.NET MVC 5,Ninject 3.我可以向MvcApplication注入某些東西嗎?

我想在網站啓動時運行一些代碼,這會從數據庫中提取一些內容。我已經建立了注射,並且在項目的其他地方工作正常。

我改變了Global.asax文件看起來像這樣...

[Inject] 
public VoucherCompanyServiceLogicInterface VoucherCompanyServiceLogic { get; set; } 

protected void Application_Start() { 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
    VoucherCompany vc = VoucherCompanyServiceLogic.GetByID(1, 1); 
} 

...但VoucherCompanyServiceLogic屬性始終爲空。我從另一個類中複製了這兩行(Inject屬性和屬性聲明),他們工作正常。

我把一些Debug.WriteLine語句這種方法,並在NinjectWebCommon類的RegisterServices方法,我可以看到,正在註冊的服務之前,我嘗試使用這一個,所以這不是問題。

任何人都知道爲什麼這總是空?

+0

偉大的問題。它是空的,因爲Ninject在應用程序生命週期中的那一點沒有活動。你需要稍微反思一下你的方法。我不太瞭解Ninject給你一個完整的答案。 –

+0

你應該有一個NinjectWebCommon文件或類似的東西,找出它的運行時間,正如Rowan Freeman指出的那樣,它可能還沒有開始,這意味着它現在無法注入你需要的東西。您應該可以在打電話之前啓動它。 –

+0

感謝您的回覆,但是如果您閱讀了我的問題的倒數第二段,您會發現我已經說過Ninject的東西已經運行在Application_Start代碼之前。正如接受的答案中指出的那樣,問題是Ninject沒有參與創建MvcApplication對象,因爲它是由ASP.NET本身創建的。不管怎麼說,還是要謝謝你。 –

回答

2

MvcApplication的實例是由ASP.Net爲您創建的,Ninject無法自動注入該屬性。當你提到注入在你的MVC應用程序的其他地方工作時,我假設你正在使用一個Nuget包,其中包括一個NinjectWebCommon以及一個MVC應用程序中DI所需的所有管道。 將在Application_Start事件之前運行,因爲它可能註冊了PreApplicationStartMethod,除了註冊依賴關係之外,它還在後臺爲MVC配置了IDependencyResolver

所以,你可以使用依賴解析器在Application_Start方法來獲取服務的一個實例:

protected void Application_Start() 
{   
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    VoucherCompanyServiceLogic = DependencyResolver.Current.GetService<IVoucherCompanyServiceLogicInterface>(); 
    if(VoucherCompanyServiceLogic != null) 
    { 
     VoucherCompany vc = VoucherCompanyServiceLogic.GetByID(1, 1); 
    } 
} 

但你有什麼計劃與VoucherCompany實例嗎? 您是否知道MvcApplication的多個實例可能由ASP.Net創建,並且不會爲每個實例調用Application_Startthis other SO questionread this article

這意味着您可以結束服務和公司都爲空的HttpApplication類的實例。如果您只想在應用程序啓動時讓公司啓動並在後續事件中使用該對象,那麼我會將VoucherCompany設置爲靜態,將其填充到Application_Start上,並且甚至不費心將該引用保存到服務中。 (根據你想達到什麼,可能會有更好的選擇。)

希望它有幫助!

+0

丹尼爾,感謝您的出色答覆,尤其是對MvcApplication工作方式的解釋。我沒有意識到這可能會被稱爲幾次。碰巧,這對我來說不是問題,因爲我打算填充一個靜態對象,就像你所建議的那樣,並且只使用服務邏輯對象從數據庫中獲取VC,而不是掛在它上面。我將DependencyResolver用於服務邏輯,它完美地工作! –

+0

很高興聽到這個,@Avrohom Yisroel。 (應用程序對象可能很棘手!) –

相關問題