ASP.NET MVC的Razor引擎:RazorView

來源:互聯網
上載者:User

Razor引擎具有兩個核心的類型,一個是表示View本身的類型RazorView,另一個則是擷取和建立它的RazorViewEngine,我們將用兩篇文章對它們分別進行剖析。Razor引擎下的View通過類型RazorView表示,它與表示Web Form引擎View的類型WebFormView都是BuildManagerCompiledView的子類。

一、BuildManagerCompiledView

為了能夠清楚地說明實現在BuildManagerCompiledView中的View啟用與呈現機制,我們列出了BuildManagerCompiledView中與此相關的內部和受保護的成員。

   1: public abstract class BuildManagerCompiledView : IView
2: {
3: internal IViewPageActivator ViewPageActivator;
4:
5: protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath);
6: protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator);
7: internal BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator, IDependencyResolver dependencyResolver);
8:
9: public void Render(ViewContext viewContext, TextWriter writer);
10: protected abstract void RenderView(ViewContext viewContext, TextWriter writer, object instance);
11:
12: internal IBuildManager BuildManager { get; set; }
13: public string ViewPath { get; protected set; }
14: }

通過《View編譯原理》的介紹我們知道採用Razor引擎的View檔案(.cshtml或者.vbhtml)最終都會編譯成一個WebViewPage類型,所以通過RazorView/WebFormView體現的View的呈現機制最終體現在對WebViewPage對象的啟用。我們可以利用BuildManager根據View檔案的虛擬路徑得到編譯後的類型。從名稱也可以看出來,BuildManagerCompiledView內部就是利用了BuildManager根據指定的View檔案虛擬路徑完成對WebViewPage對象啟用。

BuildManagerCompiledView的屬性ViewPath表示的就是View檔案的虛擬路徑,該屬性在建構函式中被初始化。BuildManagerCompiledView具有三個建構函式,對象本身的構造邏輯體現在內部建構函式上。如上面的代碼片斷所示,除了將當前ControllerContext和View檔案虛擬路徑作為建構函式的參數之外,該建構函式還具有額外兩個參數,其類型分別是IViewPageActivator和IDependencyResolver。

   1: public interface IViewPageActivator
2: {
3: object Create(ControllerContext controllerContext, Type type);
4: }

上面的代碼片斷體現了介面IViewPageActivator的定義。顧名思義,該介面旨在實現對WebViewPage對象的啟用,基於類型的對象啟用機制實現在Create方法中。BuildManagerCompiledView的建構函式中指定的ViewPageActivator被用於初始化內部欄位ViewPageActivator,如果沒有通過建構函式顯式指定ViewPageActivator對象,預設採用的是一個DefaultViewPageActivator對象。

DefaultViewPageActivator是一個具有如下定義的內部類型,我們可以看到它實際上依賴於一個DependencyResolver對象完成針對WebViewPage對象的啟用。這個DependencyResolver對象可以通過建構函式進行顯式設定,而預設使用的DependencyResolver對象來源於DependencyResolver類型的靜態屬性Current。

   1: internal class DefaultViewPageActivator : IViewPageActivator
2: {
3: private Func<IDependencyResolver> _resolverThunk;
4: public DefaultViewPageActivator() : this(null)
5: {}
6: 
7: public DefaultViewPageActivator(IDependencyResolver resolver)
8: {
9: Func<IDependencyResolver> func = null;
10: if (resolver == null)
11: {
12: this._resolverThunk = () => DependencyResolver.Current;
13: }
14: else
15: {
16: if (func == null)
17: {
18: func = () => resolver;
19: }
20: this._resolverThunk = func;
21: }
22: }
23: 
24: public object Create(ControllerContext controllerContext, Type type)
25: {
26: return (this._resolverThunk().GetService(type) ?? Activator.CreateInstance(type));
27: }
28: }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.