程式碼的整潔非常重要,畢竟縱觀整個軟體生命週期,開發時間的占比算是小的,大部分時間都會在增加修改功能和除錯。並且在開發的過程中也是要持續閱讀之前的程式碼,並在上面增加修改,有好的基礎對日後的開發和維護來說非常重要。
已經有非常多高手研究出一套整潔的軟體架構,會將整個軟體區分為各個部分,避免維護一鍋大雜燴。 今天先來最基礎的,將 ASP.NET Core 專案中的基礎設施部分拆分出來。
在示範時使用筆者比較沒那麼熟悉但是是大多數人所使用的 Visual Studio 示範。我們通常會說「.NET 專案」,但是其實在 Visual Studio 中應該是稱之為「解決方案(Solution)」,而一個「解決方案」下面可以有多個「專案(Project)」。在一般建立完畢後會有一個「解決方案」和裡面的一個「專案」。而在「整潔架構」中我們會在一個「解決方案」中建立多個「專案」,將各功能拆分到不同的「專案」中,達成關注點分離(Separation of concerns,SoC)
新增專案,選擇「類別庫」,命名為 Infrastructure ,就是基礎設施的意思。在裡面建立一個靜態類別的擴充方法,通常會取名叫 Startup ,也有人叫做 DependencyInjection class。這裡使用 Startup 示範。
此專案需要有安裝任何 Microsoft.AspNetCore 開頭的套件,不然會無法使用 IServiceCollection。如果都沒有的話最少需要安裝 Microsoft.AspNetCore 套件,不過此套件已經被棄用不再更新,所以真的都沒有的話才安裝這個。
最基礎內容如下:
在原本專案的 Program.cs 中使用剛剛建立的 AddInfrastructure
如果一直出現 Cannot resolve symbol 'AddInfrastructure' 錯誤訊息,代表原本專案的 .csproj 檔案中沒有參考到 Infrastructure 專案,可以手動在原本專案的 .csproj 檔案中新增參考
將原本在 Program.cs 檔案中包括 日誌紀錄、異常監視、第三方服務(E-mail, 簡訊)、身分驗證授權、工具類別等的內容抽離出來,放到 Infrastructure 專案中的 Startup 內,很好的簡化了原本又臭又長的 Program.cs ,讓程式碼依照功能分類,方便後續的開發和維護。
專案資料夾如下:
參考資料:
Clean Architecture with .NET Core: Getting Started
Clean Architecture In ASP.NET Core Web API
GitHub - jasontaylordev/CleanArchitecture
GitHub - fullstackhero/dotnet-webapi-boilerplate
已經有非常多高手研究出一套整潔的軟體架構,會將整個軟體區分為各個部分,避免維護一鍋大雜燴。 今天先來最基礎的,將 ASP.NET Core 專案中的基礎設施部分拆分出來。
在示範時使用筆者比較沒那麼熟悉但是是大多數人所使用的 Visual Studio 示範。我們通常會說「.NET 專案」,但是其實在 Visual Studio 中應該是稱之為「解決方案(Solution)」,而一個「解決方案」下面可以有多個「專案(Project)」。在一般建立完畢後會有一個「解決方案」和裡面的一個「專案」。而在「整潔架構」中我們會在一個「解決方案」中建立多個「專案」,將各功能拆分到不同的「專案」中,達成關注點分離(Separation of concerns,SoC)
新增專案,選擇「類別庫」,命名為 Infrastructure ,就是基礎設施的意思。在裡面建立一個靜態類別的擴充方法,通常會取名叫 Startup ,也有人叫做 DependencyInjection class。這裡使用 Startup 示範。
此專案需要有安裝任何 Microsoft.AspNetCore 開頭的套件,不然會無法使用 IServiceCollection。如果都沒有的話最少需要安裝 Microsoft.AspNetCore 套件,不過此套件已經被棄用不再更新,所以真的都沒有的話才安裝這個。
dotnet add package Microsoft.AspNetCore
最基礎內容如下:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Infrastructure;
public static class Startup
{
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration config)
{
// 將其他基礎設施相關內容寫在這裡,而不是放在 Program.cs 中
return services;
}
}
在原本專案的 Program.cs 中使用剛剛建立的 AddInfrastructure
builder.Services.AddInfrastructure(builder.Configuration);
var app = builder.Build();
如果一直出現 Cannot resolve symbol 'AddInfrastructure' 錯誤訊息,代表原本專案的 .csproj 檔案中沒有參考到 Infrastructure 專案,可以手動在原本專案的 .csproj 檔案中新增參考
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>aspnet-RuyutWebApplication-454EB986-FC68-4BB9-808F-87B7EA019F81</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.21"/>
<PackageReference Include="Microsoft.Identity.Web" Version="1.16.0"/>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
</ItemGroup>
</Project>
將原本在 Program.cs 檔案中包括 日誌紀錄、異常監視、第三方服務(E-mail, 簡訊)、身分驗證授權、工具類別等的內容抽離出來,放到 Infrastructure 專案中的 Startup 內,很好的簡化了原本又臭又長的 Program.cs ,讓程式碼依照功能分類,方便後續的開發和維護。
專案資料夾如下:
MySolution/
|-- src(所有專案)/
| |-- Domain/
| |-- Application/
| |-- API/
| |-- Web/
| `-- Infrastructure/
| `-- Startup.cs
|-- test(所有測試專案)/
| |-- Domain.Test/
| |-- Application.Test/
| |-- API.Test/
| |-- Web.Test/
| `-- Infrastructure.Test/
|-- samples(範例)/
|-- docs(文件)/
|-- MySolution.sln
`-- README.md
參考資料:
Clean Architecture with .NET Core: Getting Started
Clean Architecture In ASP.NET Core Web API
GitHub - jasontaylordev/CleanArchitecture
GitHub - fullstackhero/dotnet-webapi-boilerplate
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com