當前位置:
首頁 > 最新 > ASP.NET Core中為指定類添加WebApi服務功能

ASP.NET Core中為指定類添加WebApi服務功能

POCO Controller是ASP.NET Core中的一個特性,雖然在2015年剛發布的時候就有這個特性了,可是大多數開發者都只是按原有的方式去寫,而沒有用到這個特性。其實,如果利用這個特性進行稍微封裝後,用在SOA架構中Service層的場景中是極其便利的。這篇文章主要就是說我最近在學習使用開源AOP庫AspectCore寫WebApi動態代理客戶端的時候,實現為普通類無添加WebApi服務的過程。

POCO控制器簡介

POCO控制器就是ASP.NET Core項目中所有帶有後綴的類、或者標記了特性的類,雖然沒有像模版項目中那樣繼承自Controller類,也會被識別為控制器,擁有跟普通控制器一樣的功能,像下面這段代碼中,兩個類都會被識別成控制器:

POCO控制器原理

其實,在ASP.NET Core中,已經不像舊版本的 ASP.NET WebApi 那樣,通過ControllerFactory來創建Controller,多虧於ASP.NET Core一脈相承的IoC框架,ASP.NET Core中的內部實現變得更優雅。其中POCO控制器的核心原理就在這個介面的實現。

通過aspnet/Mvc項目的Github源碼倉庫中查詢得知,Mvc里把Controller、ViewComponent、TagHelper、Views等組件定義為特性(Feature),如,特性里就存放了應用中被識別為相組件的類型的集合,如如中就存放了所有類型。這個介面是用來給MVC框架提供控制器類型識別的介面,當把這個介面的實現註冊到服務配置中,就能為其中識別的類型提供控制器功能。

ControllerFeatureProvider是這個介面的默認實現,其中有一個方法的功能就是判斷某類型是否為控制器的。而介面方法則為把傳入的 「Mvc應用部分(,大概是指Mvc的作用程序集)」中的類型都一一判斷,如果是控制器,那麼就加入控制器特性對象中。

實現自定義判斷規則

通過上面的剖析,我們就知道要實現自定義的控制器判斷規則,只需要重寫類或者重新實現介面,但是由於不是虛方法或抽象方法,所以不能被重寫,那麼只能重新寫一個類來實現介面了。為了兼容原來規則,我把原來的規則照搬過來,複製了的方法(開源的好處),並且在中加入了自己的規則。先貼代碼,避免篇幅過長,方法的實現就直接鏈接到源碼了:

上面代碼的原理,是按照我的框架的需求來改寫的,構造方法傳入的參數ServiceTypes是定義了服務方法的介面的類型,介面和對應實現類似於以下代碼,這些代碼可以寫在一個.NET Core控制台項目中。

其中TestService類就是會被識別為控制器的類,但是介面和實現是可以分開在不同程序集的。通過原本類中方法的參數中的類型是不包括除了引用了Mvc的程序集的其它程序集的,所以我這裡用自己實現的類型掃描類中的靜態變數來獲取當前應用程序的所有引用的(自己創建的項目)程序集的,具體實現的代碼在我的框架[Shriek]的源碼中。

配置自定義規則

現在,我們擁有了自定義控制器識別規則,那麼,怎麼配置到Mvc中呢?又要去翻源碼了!在擴展類中,有一個的擴展方法(也有這樣的擴展方法),它的參數是傳入參數的委託,而中有一個屬性,用來存儲所有實例,會在應用第一次運行的時候,循環這些「特性提供器」提供所有上面提到的MVC特性。所以,只要我們在這裡添加我們自定義的控制器特性提供器,MVC框架內部就能識別我們的指定的類型為控制器,並為他們添加控制器的相關功能。

設計有點繞,那麼我們用代碼來實現:

看看效果

現在,在TestService類所在項目文件中引入以下Nuget包(沒錯,運行一個webapi只需要兩個Nuget包):

然後在控制台程序的入口文件Program.cs的Main方法中寫入一下代碼:

一切編譯通過後,點擊運行,在瀏覽器中訪問」http://localhost:8080/test/elderjames」,如果看到返回了「Hello elderjames」,那麼就大功告成啦!

總結

這篇文章中主要介紹了通過實現介面實現設置指定類型為WebApi控制器的方法。

在接下來的文章中,我會介紹如何從介面獲取自定義特性標籤,實現從介面獲得mvc特性,使得介面和實現類都不依賴MVC庫的方法,只要在介面中以標記特性的方式定義了路由和http方法,實現類的操作就都按照介面的路由和http方法去提供WebApi服務,最後還要介紹使用功能強大的.NTE Core開源AOP框架AspectCore實現的動態代理客戶端,註冊以上所說的介面,即可獲得可以調用對應的WebApi服務。這些工作的源碼可以在我的框架示例項目中運行,大家有興趣可以看看效果。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 dotNET跨平台 的精彩文章:

TAG:dotNET跨平台 |