ASP.NET Core 整潔架構基礎 拆分基礎設施層

程式碼的整潔非常重要,畢竟縱觀整個軟體生命週期,開發時間的占比算是小的,大部分時間都會在增加修改功能和除錯。並且在開發的過程中也是要持續閱讀之前的程式碼,並在上面增加修改,有好的基礎對日後的開發和維護來說非常重要。

已經有非常多高手研究出一套整潔的軟體架構,會將整個軟體區分為各個部分,避免維護一鍋大雜燴。 今天先來最基礎的,將 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

留言