🚫 Ad Blocker Detected

Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker

請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面

0%

Agenda

完賽感想

這三十天無法對於MVC全部原始碼做詳細介紹,我盡量在這三十篇講述MVC執行過程中重要知識點,閱讀MVC原始碼真不是很簡單事情.

但閱讀完後我對於OOP和如何合理撰寫程式碼一個系統有更深入了解(因為MVC很多地方很好運用OOP概念原則)

希望大家經過閱讀這三十篇文章可以對於IIS託管和Asp.net MVC原理有更深入了解.

  1. Http對於IIS Server請求如何導向Asp.net MVC執行
  2. Asp.net MVC原始碼有基本了解和知道哪幾個重要類別,了解後能依照系統需要替換改寫.
  3. Asp.net MVC用到很多設計技巧,希望大家能更了解設計模式如何運用在實戰中
  4. 可以嘗試閱讀其他知名的開源框架(Dapper,AutoMapper,Autofac,Json.net…..)

如果想要了解Dapper原理讀者我推薦去閱讀,我隊友暐翰系列文章進階學習 ADO.NET、Dapper、Entity Framework 系列寫得很詳細且有影片教學大推!!

感謝這次的夥伴 [IT成長團]

感謝這次可以跟IT成長團的大家一起參與並完成It邦幫忙鐵人活動.

Read more »

Agenda

前言

View頁面(razor,aspx…)都是繼承WebViewPage<TModel>頁面,

今天會帶大家寫一個範例完成透過Route判斷多國錢幣符號.

多國路由設定

Route設定上多一個{culture}區塊.如果使用者沒有輸入預設使用英文(en).

1
2
3
4
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index", culture = "en" });

取得貨幣符號

建立一個介面ICurrency裡面有個方法可以取得傳入國家貨幣符號.

Read more »

Agenda

前言

View頁面(razor,aspx…)都是繼承WebViewPage<TModel>頁面,

今天會帶大家寫一個範例完成透過Route判斷多國錢幣符號.

多國路由設定

Route設定上多一個{culture}區塊.如果使用者沒有輸入預設使用英文(en).

1
2
3
4
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index", culture = "en" });

取得貨幣符號

建立一個介面ICurrency裡面有個方法可以取得傳入國家貨幣符號.

Read more »

Agenda

前言

今天要分享對於ActionInvoker進行替換成自己客制化的IActionInvoker

MVC原始碼中有個CreateActionInvoker方法來取得一個IActionInvoker物件,可以看到她會先透過Resolver.GetService從解析器中取得我們的IActionInvoker如果沒有在new一個AsyncControllerActionInvoker物件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected virtual IActionInvoker CreateActionInvoker()
{
IAsyncActionInvokerFactory asyncActionInvokerFactory = Resolver.GetService<IAsyncActionInvokerFactory>();
if (asyncActionInvokerFactory != null)
{
return asyncActionInvokerFactory.CreateInstance();
}
IActionInvokerFactory actionInvokerFactory = Resolver.GetService<IActionInvokerFactory>();
if (actionInvokerFactory != null)
{
return actionInvokerFactory.CreateInstance();
}

// Note that getting a service from the current cache will return the same instance for every request.
return Resolver.GetService<IAsyncActionInvoker>() ??
Resolver.GetService<IActionInvoker>() ??
new AsyncControllerActionInvoker();
}

我們解析器一樣使用Autofac容器來幫我們完成(程式碼會基於昨天Autofac範例往上擴充)

建立自己的IActionInvoker(CustomerActionInvoker)

在取得IActionInvoker首先會透過Resolver解析器來取得,這就提供我們一個可替換接口.

藉由這個機制讓我們可以重寫自己ActionInvoker物件.

Read more »

Agenda

前言

今天要分享對於ActionInvoker進行替換成自己客制化的IActionInvoker

MVC原始碼中有個CreateActionInvoker方法來取得一個IActionInvoker物件,可以看到她會先透過Resolver.GetService從解析器中取得我們的IActionInvoker如果沒有在new一個AsyncControllerActionInvoker物件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected virtual IActionInvoker CreateActionInvoker()
{
IAsyncActionInvokerFactory asyncActionInvokerFactory = Resolver.GetService<IAsyncActionInvokerFactory>();
if (asyncActionInvokerFactory != null)
{
return asyncActionInvokerFactory.CreateInstance();
}
IActionInvokerFactory actionInvokerFactory = Resolver.GetService<IActionInvokerFactory>();
if (actionInvokerFactory != null)
{
return actionInvokerFactory.CreateInstance();
}

// Note that getting a service from the current cache will return the same instance for every request.
return Resolver.GetService<IAsyncActionInvoker>() ??
Resolver.GetService<IActionInvoker>() ??
new AsyncControllerActionInvoker();
}

我們解析器一樣使用Autofac容器來幫我們完成(程式碼會基於昨天Autofac範例往上擴充)

建立自己的IActionInvoker(CustomerActionInvoker)

在取得IActionInvoker首先會透過Resolver解析器來取得,這就提供我們一個可替換接口.

藉由這個機制讓我們可以重寫自己ActionInvoker物件.

Read more »

Agenda

前言

產生Controller物件相關物件關係如下面UML圖

relationship_pic.PNG

透過ControllerFactory建立一個Controller控制器物件.而ControllerFactory依賴IControllerActivator物件產生Controller.

上面IControllerActivator可以透過建立使用我們的依賴注入容器來替換原本反射產生物件.

DependencyResolverMVC提供的一個可替換物注入點,今天我們會藉由他來我們實現注入MVC方式.

Aufofac依賴注入容器

在實現自己的DependencyResolver前先談談Autofac容器做甚麼用的?

Read more »

Agenda

前言

產生Controller物件相關物件關係如下面UML圖

relationship_pic.PNG

透過ControllerFactory建立一個Controller控制器物件.而ControllerFactory依賴IControllerActivator物件產生Controller.

上面IControllerActivator可以透過建立使用我們的依賴注入容器來替換原本反射產生物件.

DependencyResolverMVC提供的一個可替換物注入點,今天我們會藉由他來我們實現注入MVC方式.

Aufofac依賴注入容器

在實現自己的DependencyResolver前先談談Autofac容器做甚麼用的?

Read more »

Agenda

前言

UrlRoutingModule對於OnPostResolveRequestCache事件添加一個對於MVC很重要的動作,透過RouteCollection取得此次請求匹配RouteData物件.

利用此RouteData取得要使用的IHttpHandler來執行它.

1
RouteData routeData = RouteCollection.GetRouteData(context);

RouteCollection是全域路由註冊表.我們在一開始使用MapRoute註冊與之匹配ControllerAction

RouteCollection是基於RouteBase物件集合,所以它可以存放所有繼承RouteBase物件,RouteBase這個類別有一個重要的方法來取得RouteData,RouteData封裝此次Http請求的Controller,Action…等資訊

對於每個Http請求依序找尋第一個匹配路由規則

1
2
3
4
5
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Read more »

Agenda

前言

UrlRoutingModule對於OnPostResolveRequestCache事件添加一個對於MVC很重要的動作,透過RouteCollection取得此次請求匹配RouteData物件.

利用此RouteData取得要使用的IHttpHandler來執行它.

1
RouteData routeData = RouteCollection.GetRouteData(context);

RouteCollection是全域路由註冊表.我們在一開始使用MapRoute註冊與之匹配ControllerAction

RouteCollection是基於RouteBase物件集合,所以它可以存放所有繼承RouteBase物件,RouteBase這個類別有一個重要的方法來取得RouteData,RouteData封裝此次Http請求的Controller,Action…等資訊

對於每個Http請求依序找尋第一個匹配路由規則

1
2
3
4
5
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Read more »

Agenda

前言

上一篇說到最終會透過一個實現IView物件(Razor是透過RazorView)來完成,RenderView方法將BuildManagerCompiledView方法取得物件轉換型別成WebViewPage.

.cshtml最終會編譯成一個繼承WebViewPage檔案.

本篇會來解析View編譯原理

我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.

WebViewPage

WebViewPage繼承樹最頂層有個WebPageExecutingBase抽象類別,他擁有一個抽象方法Execute,View轉成c#程式會建立一個類別就會繼承於WebViewPage並把使用者頁面程式碼實現在Execute方法.

1
public abstract void Execute();
Read more »