天天看點

如何将 .NetFramework WebApi 按業務拆分成多個子產品

如何将 .NetFramework WebApi 按業務拆分成多個子產品

在 .NetFramework 中使用 WebApi ,在不讨論 微服務 的模式下,大部分都是以層來拆分庫的 :

基礎設施

資料存儲層

服務層

WeApi 層

一些其它的功能庫

項目結構可能會像下面這樣子

有些人可能會将其中的 資料存儲層、服務層 按業務功能進行垂直拆分,

但是到了 WebApi 這層,就不得不把所向所有業務功能的 Controller 都堆在這兒了。

随着業務的堆積,WebApi 這層的代碼量越來越大,耦合性也越來越強,越來越難維護。

……

………

…………

這時候,微服務 就出現了。

可是,微服務 給系統所帶來的複雜程度是極高的,

在某些場景下,轉 微服務 可以很好的解決這些問題,但是又會帶來更多的新問題,

是以我們希望有一種模式,即能像 微服務 那樣對代碼進行垂直切分,又能保持簡單易維護的 單體應用程式 模式。

打算在 單體應用程式 中解決這種趨于 臃腫 問題,我們可以借鑒 微服務 那種 按業務垂直拆分 的思想。

但是與 微服務 不同是,它依然是單啟動程式,這個啟動程式能夠組織出散落在各個子產品中的所有 WebApi 并暴露給外部。

換個角度思考,其實就是将業務 子產品化 。

微軟維護的 Ochard 架構很好的實作了這些功能,但是使用 Orchard 可能會給你帶來以下問題

這是一個非常重型的架構,代碼量比較大,運作速度不佳

幾乎沒有什麼中文的文檔( 最多隻能找到 HelloWorld 這樣的淺顯的教程 )

官網文檔是英文的,對閱讀有較高的要求,而且速度很慢,需要使用正确的閱讀方式

系統中充斥着大量的隐匿限制( 在類型名稱上的限制,前端更是使用了大量的 DynamicObject ,很難了解到到底包含了哪些可用 成員 )

....

于是我基于 Reface.AppStarter 開發了一套輕量級的子產品化 WebApi 架構 【 Reface.AppStarter.WebApi 】,它實作了以下功能

垂直拆分你的 WebApi Controller 至不同的 Library

開箱即用的 Controller 構造函數注入

具備 Reface.AppStarter 中的 EventBus 和 CommandBus 功能,可以很好的進行子產品間的通信

在 啟動子產品 決定啟動哪些業務子產品

使用 Reface.AppStarter.WebApi 很簡單,它對原來的開發風格幾乎沒有什麼影響,

下面将示範如何使用 Reface.AppStarter.WebApi 将 WebApi 項目拆分至各種子產品

Step 1 - 建立空的 WebApi 項目

建立一個 WebApi 項目,但是你不需要在這裡寫任何的 Controller , 它隻是你的啟動程式,不需要為它編寫任何與啟動無關的代碼。

為你的 WebApi 添加 Nuget 引用 Reface.AppStarter 。

Step 2 - 建立業務庫

建立業務 Library ,比如 Users,你将在這個 Library 中實作有關 Users 的所有功能,包括 Controller。

通過 Nuget 引用 Reface.AppStarter.NPI

Step 3 - 在業務庫中編寫控制器

為 Users Library 添加一個 Controllers 的目錄,并編寫你的控制器

[ApiRoute("hello")]

public class HelloController : ApiController

{

[Route]
public string Get()
{
    return "HelloWorld!";
}           

}

Reface.AppStarter.NPI 包含了編寫一個 WebApi 的所有依賴項。

是以你隻要通過 Nuget 添加了 Reface.AppStarter.NPI 就可以編寫屬于你的 ApiController 。

如果你需要向 控制器 中注入一些其它的元件,你隻要通過構造函數注入即可:

private readonly IHelloService helloService;

public HelloController(IHelloService helloService)
{
    this.helloService = helloService;
}

[Route]
public string Get()
{
    return "HelloWorld!";
}           

Step 4 - 編寫業務庫的 AppModule

為你的 Users Library 編寫一個 AppModule 。

在 Reface.AppStarter 架構模式下,每一個 Library 都至少要提供一個 AppModule ,以供給其它子產品依賴。

你的 Users 也不例外,

UsersAppModule 需要使用 WebApi 功能,是以 UsersAppModule 要依賴 WebApiAppModule

[WebApiAppModule]

public class UsersAppModule : AppModule

如果你還需要 自動配置、自動 IOC / DI 注冊裝配,那你也可以根據你的需求添加其它的 AppModule。

Step 5 - 讓你的啟動項目依賴 UsersAppModule

首先,你需要為你啟動項目建立一個 AppModule ,比如 WebAppModule

[UsersAppModule]

public class WebAppModule : AppModule

然後你需要建立一個 Global.asax ,相信大家應該都知道這是個什麼吧。

修改你的 Global.asax 檔案,使其繼承于 RefaceHttpApplication  ,這裡的 T ,就是你的 WebAppModule。

public class MyWebApiApplication : RefaceHttpApplication

這樣,就會在 Web 應用程式啟動的時候,完成 Reface.AppStarter 中的所有過程。

提示 :

這個 RefaceHttpApplication 隻是封裝了 AppSetup.Start 的過程,你也可以不繼承此類,并手動完成對 AppSetup 的啟動。

Step 6 - 配置檔案

通過 RefaceHttpApplication 啟動,會以站點根目錄的 app.json 檔案作為 Reface.AppStarter 架構内的配置檔案。

Reface.AppStarter.WebApi  内隻有一個 Config 類型,它允許重新定義所有 WebApi 的路由字首

"WebApi": {

"Prefix": "myapi"           

你可以通過修改這個 Prefix 來修改所有控制器的字首名稱,( 預設值是 api )。

Step  7 - 運作

運作你的啟動程式吧,并鍵入 /myapi/hello 你就會看到 HelloController 雖然寫在了别的 Library 裡,但是依然可以成功的通路。

至此就介紹了 Reface.AppStarter.WebApi 中的主要功能。

有關 Reface.AppStarter 相關功能,可以閱讀 《

https://www.cnblogs.com/ShimizuShiori/p/12610668.html

有關 事件總線,會在後面的文章中向大家介紹。

原文位址

https://www.cnblogs.com/ShimizuShiori/p/12677765.html

繼續閱讀