2011-10-05 65 views

回答

9

有布拉德·威爾遜http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

的其他人的意見允許構造函數注入不完全正確的語句在博客視圖注射的expample。是的IDependencyResolver可以創建具有構造函數參數的視圖。但是除非你正在實現你自己的視圖引擎,否則這根本不會對你有所幫助。像剃鬚刀這樣的現有視圖引擎會要求你有一個無參數的構造函數。這意味着您只能對視圖進行屬性注入。

但是正如其他人所說的那樣,你不應該無論如何都要進行注射。您的視圖應該是愚蠢的,只是將視圖模型呈現爲HTML。任何需要依賴的應該在控制器或服務中完成。

+0

如果您有自定義授權,您希望能夠用作視圖的屬性,該怎麼辦? (指定某些不應該在沒有所需權限的情況下在剃鬚刀中渲染的部分) –

4

是的,這是可能的,但我真的認爲這不是一個好主意。爲什麼在視圖層面需要一些「服務」?記住關鍵的MVC指南 - 一個視圖必須是愚蠢的。事實上,它應該只是一些用於將視圖模型對象轉換爲HTML的模板,僅此而已。

+0

好點。他應該將服務注入到Controller中,而不是視圖。 – Steven

+5

i18n視圖內的翻譯。視圖包含鍵,您只需拖動正確的翻譯。沒有理由不這麼認爲。 – BradLaney

+2

那些只包含文本的本地化或配置類型服務呢?他們在技術上仍然愚蠢 –

7

這是不可能執行構造函數注入。但是你可以做這樣的事情有,比方說,Ninject:

 
    public abstract class CustomViewBase<TModel> : WebViewPage<TModel> where TModel : class 
    { 
     [Inject] 
     public IFace Face 
     { 
      get; 
      set; 
     } 
    } 

,並假設你已經設定了的IDependencyResolver在Global.asax中,你應該有正確的初始化屬性@Face。 但是一個重要的警告:您可能無法訪問_Layout.cshtml中的@Face,因爲(根據Brad Wilson)佈局在MVC之外工作,當您嘗試在佈局頁面中訪問時,@Face將爲null。

在任何情況下,我同意其他人的觀點不應該處理任何複雜的邏輯。

+1

這太棒了!我不知道你可以用Ninject做到這一點。 –

+0

也不一定是Ninject。 Autofac和其他人會做同樣的事情,而不需要裝飾者。 –

+0

它在繼承的頁面中運行良好。但是,在MVC中的佈局(masterpage)內部訪問相同的注入類方法的解決方案是什麼 –

相關問題