---
# System prepended metadata

title: ASP.NETCore 簡易描述
tags: [Akka, Web, DotNet Core]

---

###### 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設計.(以上為目前初步結論)
 
 


