2021年12月28日 星期二

ASP.NET Core Blazor 使用 AutoMapper

ASP.NET Core Blazor 使用 AutoMapper

建立Blazor Server 應用程式專案

  • 開啟 Visual Studio 2022
  • 選擇右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗中
  • 從右上方的專案類型下拉按鈕中,找到並選擇 [Web]
  • 從可用專案範本清單內,找到並選擇 [Blazor Server 應用程式]
  • 點選左下方 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗中
  • 在 [專案名稱] 欄位中輸入 bzAutoMapper
  • 點選左下方 [下一步] 按鈕
  • 在 [其他資訊] 對話窗中
  • 在 [目標 Framework] 下拉選單中,選擇 [.NET 6.0 (目前)]
  • 點選左下方 [建立] 按鈕

安裝 AutoMapper 套件

  • 滑鼠右擊專案節點
  • 從彈出功能表清單中點選 [管理 NuGet 套件]
  • 在 [NuGet: bzAutoMapper] 視窗中點選 [瀏覽] 標籤頁次
  • 在文字輸入盒中輸入此套件名稱 AutoMapper.Extensions.Microsoft.DependencyInjection
  • 選擇作者為 [Jimmy] 的 [AutoMapper.Extensions.Microsoft.DependencyInjection] 套件選項
  • 安裝此套件該專案內

建立測試用的兩個類別

  • 滑鼠右擊 [Pages] 資料夾
  • 從彈出功能表清單中點選 [加入] > [類別]
  • 在 [新增項目 - bzAutoMapper] 對話窗下方的 [名稱] 欄位輸入 MyModel.cs
  • 點選右下方 [新增] 按鈕來新增這個類別
  • 使用底下程式碼來替換這個類別的定義
public class MyModel
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
    public DateOnly MyDateOnly { get; set; }
}
  • 滑鼠右擊 [Pages] 資料夾
  • 從彈出功能表清單中點選 [加入] > [類別]
  • 在 [新增項目 - bzAutoMapper] 對話窗下方的 [名稱] 欄位輸入 MyModelDto.cs
  • 點選右下方 [新增] 按鈕來新增這個類別
  • 使用底下程式碼來替換這個類別的定義
public class MyModelDto
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
    public DateOnly MyDateOnly { get; set; }
}

建立 AutoMapper Profile 類別

  • 滑鼠右擊 [Pages] 資料夾
  • 從彈出功能表清單中點選 [加入] > [類別]
  • 在 [新增項目 - bzAutoMapper] 對話窗下方的 [名稱] 欄位輸入 AutoMapping.cs
  • 點選右下方 [新增] 按鈕來新增這個類別
  • 使用底下程式碼來替換這個類別的定義
using AutoMapper;
public class AutoMapping : Profile
{
    public AutoMapping()
    {
        CreateMap<MyModel, MyModelDto>();
        CreateMap<MyModelDto, MyModel>();
    }
}

註冊 AutoMapper 服務到相依性注入容器內

  • 在專案根目錄下找到並且打開 [Program.cs] 檔案

  • 找到 builder.Services.AddSingleton<WeatherForecastService>(); 敘述

  • 在其下方加入 builder.Services.AddAutoMapper(c => c.AddProfile<AutoMapping>()); 敘述

    記得要加入相關的命名空間參考敘述

開始使用 AutoMapper

  • 在 [Pages] 資料夾下找到並打開 [Index.razor]
  • 將這個 Razor 元件替換為底下內容
@page "/"

@using AutoMapper
@inject IMapper Mapper

@code {
    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender == true)
        {
            MyModel myModel = new MyModel()
                {
                    MyDateOnly = DateOnly.FromDateTime(DateTime.Now.AddDays(5)),
                    MyInt = 168,
                    MyString = "New MyModel"
                };
            Console.WriteLine($"New MyModel Hash:{myModel.GetHashCode()} Int:{myModel.MyInt} Date:{myModel.MyDateOnly} String:{myModel.MyString}");
            MyModelDto myModelDto = Mapper.Map<MyModelDto>(myModel);
            myModelDto.MyInt = 999;
            myModelDto.MyString = "Mapper From MyModel";
            myModelDto.MyDateOnly = DateOnly.FromDateTime(DateTime.Now.AddDays(-5));
            Console.WriteLine($"New MyModel Hash:{myModel.GetHashCode()} Int:{myModel.MyInt} Date:{myModel.MyDateOnly} String:{myModel.MyString}");
            Console.WriteLine($"Mapper MyModel to MyModelDto Hash:{myModelDto.GetHashCode()} Int:{myModelDto.MyInt} Date:{myModelDto.MyDateOnly} String:{myModelDto.MyString}");
        }
    }
}

執行並且看結果

  • 底下是執行後的主控台所輸出的文字
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7140
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5140
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\Vulcan\Projects\BlazorApp7\
New MyModel Hash:5773521 Int:168 Date:2022/1/2 String:New MyModel
New MyModel Hash:5773521 Int:168 Date:2022/1/2 String:New MyModel 

Mapper MyModel to MyModelDto Hash:6630602 Int:999 Date:2021/12/23 String:Mapper From MyModel 




沒有留言:

張貼留言