###### tags: `Akka` `Web` `DotNet Core` # ASP.NETCore 簡易描述 .NET Core為開源的通用開發平臺 (Source:https://github.com/dotnet/aspnetcore https://github.com/dotnet/efcore) Visual Studio 2019版本的也可以windows, Macos與Linux上安裝。 ## Framewrok架構 ASP .NET Core 是由 .NET Standard程式庫所組成。 使用 .NET Standard 2.0 撰寫的程式庫可在任何實作 .NET Standard 2.0 的 .NET 平台上執行。 ![](https://i.imgur.com/CwJlK9n.png) 紅框處 . NetCore重點描述 - 編譯/建制程式碼的工具 - .Net core和 .Net framework不同在於提供了一個所謂的dotnet cli工具(也可以稱為app host),這個工具提供了一個統一的api方便對專案做一些調整,並且提供像是build或者restore package的指令。dotnet cli提供的還是一個wrapper,以compiler來說,底層其實用的也是Roslyn (.net Compiler platform) - .Net Core Base Class Library (BCL) - .Net Core和 .Net Framework一樣,有提供了所謂的BCL。不過這個BCL其實從api的角度來說是少於 .Net Framework,畢竟為了跨平台有些和Windows綁的很死的像是Windows Form就不包括在 .Net Core的BCL。CoreBCL也稱為CoreFx - Core Common Language Runtime (CoreCLR) - 同 .Net Framework一樣,也是有個CLR用來執行 .Net Core的程式,不過這個CLR和 .Net Framework不同,因此稱為CoreCLR。 Standard對應支援版本(https://docs.microsoft.com/zh-tw/dotnet/standard/net-standard) --- ## .Net vs .Net Core 差異 ![](https://i.imgur.com/E5Les6e.png) .Net Core與.Net最大差異之所可以跨平台在於底層有CoreCLR層,可針對不同的平台設計相應的運行時為中間語言CIL提供一個一致的執行環境。.Net Core的CLR則是有真的提供由微軟support的跨平台的版本。 其二是 .Net Core使用app host (dotnet cli)將CoreCLR執行起來,而 .Net Framework則不是用app host run起來。因此,.Net Core的console 程式發佈出來是.dll做結尾而不是.exe 另外 **.NET Framework 有多個 GUI 架構和 Windows 特定的 Api 不存在於 .NET Core 中。同樣地,NET Core 有跨平台功能和dot NET Framework 缺少的 Api。** 基本上 .Net Core是一個更加**模組化的平台**,換句話說整體的速度和使用的資源更少。因此更符合現代化的Microservice的架構和Container模式執行的結構。 ![](https://i.imgur.com/Fz1ipmJ.png) ![](https://i.imgur.com/hx2yPRS.png) --- ## .Net Core功能特色 - 由程式碼決定功能(Environment Configurable) - ASP .NET Core 廣泛應用了 .NET 的擴充方法 (Extension Method),將 ASP .NET Core 的功能模組 (ASP .NET Core 的術語是 Middleware) 以擴充方法的方式附掛在 IApplicationBuilder 介面上,以 Use 開頭的方法為命名標準,所有應用程式所需要的功能都必須添加在 Startup 類別內,DNX Runtime 在啟動時會搜尋應用程式內的 Startup 物件,並喚起它內部的特定方法 (如 Configure()),以加入應用程式的功能。 ![](https://i.imgur.com/bvr2ePB.png) - 內建依賴注入(Dependency Injection) - 可在 Controller 內直接注入介面物件,輕鬆達到介面隔離輕鬆替換原本依賴的真實物件為mock物件。物件生命週期統一由 .Net達到輕鬆管理。PS:Net可以使用Autofac ![](https://i.imgur.com/SvLxCbR.png) - 代管 (Hosting) 方式 - 支援自我代管以及 Web Server 代管(Application can be hosted everywhere (because it is built on top of .NET Core)) - ex Internet information services (IIS), self-hosted in its own process, or even hosted inside Docker. - REST perspective - Hosts and servers satisfy the Client-Server constraint. - Middlewares - 組成應用程式管線的軟體,用以處理要求與回應 - REST perspective - Satisfies the Layered System constraint. ![](https://i.imgur.com/80UevLH.png) ![](https://i.imgur.com/DZDYqnX.png) --- ## .Net未來走向 ![](https://i.imgur.com/kEhuqS6.png) - NET Core 3.0 在 2019/9 發表 - .NET Core 3.1 將於 2019/11 推出,為 LTS (Long Term Support,長期支援版) - 更新:3.1 發佈時程2019/12之後 .NET Core 將更名 .NET,固定每年釋出新版,並定義雙數版號為 LTS 版,單數版號為 Current 版。 - .NET 5.0 2020/11 - .NET 6.0 LTS 2021/11 - .NET 7.0 2022/11 - .NET 8.0 LTS 2023/11 目前建議就是用3.1版本,因為他會長期維護。 各版本差異: https://docs.microsoft.com/zh-tw/dotnet/core/compatibility/fx-core 版本移轉需修改處:https://docs.microsoft.com/zh-tw/aspnet/core/migration/proper-to-2x/?view=aspnetcore-3.1 功能簡史圖(來源:) ![](https://i.imgur.com/8rHGfDt.png) --- ## Web專案檔案架構建議 ![](https://i.imgur.com/lLX6s2i.png) - 資料夾分類: - Controllers: 放所有的Controller - Views: 放所有的cshtml畫面 - ViewModels: 跟View呈現有關的資料模組 - ViewComponents: View上面的元件,比如Menu之類的 - Migrations: 使用指令搬遷的資料夾(指令自動生成) - Models: 純放poco值物件,DbContext的地方,以及各式各樣的模組,Filter資料夾等等 - Core: 未來可以模組化的類別。 - Utils: 專案內,常用的擴充方式。 - Services: 放置商業邏輯的地方,Service、Repository、UnitOfWork。 - 重要檔案 - wwwroot : 靜態檔案,一般放HTML、CSS、影像和 JavaScript - Startup: 應用程式啟動設定 - ConfigureServices : 服務的定義是可提供應用程式功能的可重複使用元件。 服務會registered在中ConfigureServices註冊,並透過相依性插入(DI)或ApplicationServices在整個應用程式中使用。 - Configure 建立應用程式的要求處理管線 - appsetting.json : 組態設定檔案 --- ## Web架構與專案架構 微軟官方提供ASP .NET Core的 Clean Architecture https://docs.microsoft.com/zh-tw/dotnet/architecture/modern-web-apps-azure/common-web-application-architectures ![](https://i.imgur.com/LMZZRm4.png) ![](https://i.imgur.com/pkqr6H9.png) 多人開發上 理想上官方提到的方法,都是個概念. 實際可視狀況調整.微軟概念是 infrastructure project 其他的 app,desktop 或 其他專案可以使用,但通常不同專案性質的,通常不會這樣設計,大部分都是一個app分資料夾.不太會分專案設計( Principles of Package Design) 若需要這樣設計須考量兩個設計點 兩個考慮切入點 第一種覆用性 第二種佈署性(是否只在同一台電腦) 除非你的其他專案,也會使用到這個專案的EF或Database,會建議分專案寫(因為符合覆用性)套用到Layer與Tiers的設計概念。若Layer,分層資料夾分類跟專案分類. 那意義又不同了,如果要對應Tiers 那就是做成專案分類(像微軟那樣),開發設計彈性就比較大.就符合Tiers設計.(以上為目前初步結論)