###### 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 平台上執行。

紅框處 . 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 差異

.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模式執行的結構。


---
## .Net Core功能特色
- 由程式碼決定功能(Environment Configurable)
- ASP .NET Core 廣泛應用了 .NET 的擴充方法 (Extension Method),將 ASP .NET Core 的功能模組 (ASP .NET Core 的術語是 Middleware) 以擴充方法的方式附掛在 IApplicationBuilder 介面上,以 Use 開頭的方法為命名標準,所有應用程式所需要的功能都必須添加在 Startup 類別內,DNX Runtime 在啟動時會搜尋應用程式內的 Startup 物件,並喚起它內部的特定方法 (如 Configure()),以加入應用程式的功能。

- 內建依賴注入(Dependency Injection)
- 可在 Controller 內直接注入介面物件,輕鬆達到介面隔離輕鬆替換原本依賴的真實物件為mock物件。物件生命週期統一由 .Net達到輕鬆管理。PS:Net可以使用Autofac

- 代管 (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.


---
## .Net未來走向

- 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
功能簡史圖(來源:)

---
## Web專案檔案架構建議

- 資料夾分類:
- 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


多人開發上 理想上官方提到的方法,都是個概念. 實際可視狀況調整.微軟概念是 infrastructure project 其他的 app,desktop 或 其他專案可以使用,但通常不同專案性質的,通常不會這樣設計,大部分都是一個app分資料夾.不太會分專案設計( Principles of Package Design)
若需要這樣設計須考量兩個設計點
兩個考慮切入點
第一種覆用性
第二種佈署性(是否只在同一台電腦)
除非你的其他專案,也會使用到這個專案的EF或Database,會建議分專案寫(因為符合覆用性)套用到Layer與Tiers的設計概念。若Layer,分層資料夾分類跟專案分類. 那意義又不同了,如果要對應Tiers 那就是做成專案分類(像微軟那樣),開發設計彈性就比較大.就符合Tiers設計.(以上為目前初步結論)