輕量級。熟悉的 API。MIT 授權。支援 .NET 8、9 與 10。

在 AutoMapper 近期調整授權條款後,許多 .NET 開發者開始尋找不需要重寫多年對應程式碼的開源替代方案。

這也是我建立 Twinify 的原因之一。

Twinify 是一款輕量、高效能的物件對物件對應工具,提供熟悉的流暢 API,能輕鬆對應 DTO、實體、檢視模型、記錄以及複雜物件圖形,完全開源並採用 MIT License 授權。

如果您已經在使用 AutoMapper,轉換到 Twinify 對於許多常見對應情境來說將會相當直觀。


為什麼選擇 Twinify?

✔ MIT 授權

✔ 支援 .NET 8、.NET 9 與 .NET 10

✔ 熟悉的 AutoMapper 風格流暢 API

✔ 支援相依性注入

✔ 自動依命名慣例對應

✔ 支援巢狀物件與集合

✔ 支援展平(Flattening)

✔ 支援記錄與建構子對應

✔ 提供 Explain<TSource, TDestination>() 對應診斷功能


安裝

安裝所需的套件。

dotnet add package Twinify
dotnet add package Twinify.DependencyInjection

Enter fullscreen mode Exit fullscreen mode


步驟 1 — 建立對應設定檔

透過繼承 MappingProfile 來定義對應規則。

public class UserProfile : MappingProfile
{
    public UserProfile()
    {
        CreateMap<User, UserDto>()
            .ForMember(d => d.FullName,
                opt => opt.MapFrom(s => $"{s.FirstName} {s.LastName}"))
            .ForMember(d => d.Password,
                opt => opt.Ignore());
    }
}

Enter fullscreen mode Exit fullscreen mode

Twinify 採用熟悉的流暢式設定模型,對於來自 AutoMapper 的開發者來說應該會感到自然。


步驟 2 — 註冊 Twinify

在應用程式啟動時註冊您的對應設定檔。

builder.Services.AddTwinify(cfg =>
{
    cfg.AddProfile<UserProfile>();
});

Enter fullscreen mode Exit fullscreen mode


步驟 3 — 對應您的物件

在需要的地方注入 IMapper

public class UserService(IMapper mapper)
{
    public UserDto GetUser(User user)
    {
        return mapper.Map<UserDto>(user);
    }
}

Enter fullscreen mode Exit fullscreen mode

就是這麼簡單。

Twinify 會自動對應名稱相同的屬性,同時允許在需要時進行完整自訂。


功能特色

自動依命名慣例對應

名稱相同的屬性會自動進行對應。

User.Name
        ↓
UserDto.Name

Enter fullscreen mode Exit fullscreen mode

無需任何設定。


自動展平

巢狀屬性會自動展平。

Source

User.Address.City

↓

Destination

UserDto.AddressCity

Enter fullscreen mode Exit fullscreen mode


巢狀物件對應

Twinify 會遞迴對應巢狀物件圖形。

Order
 └── Customer
 └── Address
 └── Contacts

↓

OrderDto
 └── CustomerDto
 └── AddressDto
 └── ContactDtos

Enter fullscreen mode Exit fullscreen mode


集合對應

支援:

  • 清單
  • 陣列
  • 字典
  • 巢狀集合

建構子與記錄對應

Twinify 會自動建構目標類型,包括:

  • 不可變物件
  • 記錄
  • 參數化建構子

流暢式設定

Twinify 支援豐富的設定 API,包括:

  • CreateMap
  • ForMember
  • MapFrom
  • Ignore
  • Condition
  • ConvertUsing
  • BeforeMap
  • AfterMap
  • ReverseMap
  • IncludeBase
  • PreserveReferences

說明您的對應

讓 Twinify 與眾不同的功能之一是對應診斷。

mapper.Explain<User, UserDto>();

Enter fullscreen mode Exit fullscreen mode

不必猜測某個屬性為何以特定方式對應,Explain() 會清楚顯示每個目標成員的來源,讓除錯變得更加容易。


從 AutoMapper 遷移

許多現有的 AutoMapper 專案只需少量機械式變更即可完成遷移。

AutoMapper Twinify
Profile MappingProfile
CreateMap() 相同的熟悉 API
ForMember() 相同的熟悉 API
MapFrom() 相同的熟悉 API
ReverseMap() 支援
AddAutoMapper() AddTwinify()
自訂解析器 ConvertUsing() 與成員設定

遷移指南

1. 移除 AutoMapper

dotnet remove package AutoMapper

Enter fullscreen mode Exit fullscreen mode


2. 安裝 Twinify

dotnet add package Twinify
dotnet add package Twinify.DependencyInjection

Enter fullscreen mode Exit fullscreen mode


3. 更新您的設定檔


public class UserProfile : Profile

Enter fullscreen mode Exit fullscreen mode

替換為

public class UserProfile : MappingProfile

Enter fullscreen mode Exit fullscreen mode


4. 更新相依性注入


builder.Services.AddAutoMapper(...);

Enter fullscreen mode Exit fullscreen mode

替換為

builder.Services.AddTwinify(cfg =>
{
    cfg.AddProfile<UserProfile>();
});

Enter fullscreen mode Exit fullscreen mode


5. 建置與測試

許多現有的 CreateMap()ForMember() 設定應該只需要少量或不需修改即可使用。

與任何遷移一樣,建議執行現有的對應測試來驗證行為。


我為什麼建立 Twinify

我希望建立一個具備以下特性的對應工具:

  • 開源
  • 輕量級
  • 容易理解
  • 讓現有 AutoMapper 使用者感到熟悉
  • 專為現代 .NET 打造

而非強迫開發者學習全新的 API,Twinify 專注於讓遷移過程直觀,同時持續隨著社群回饋演進。


開始使用

📦 NuGet

dotnet add package Twinify

Enter fullscreen mode Exit fullscreen mode

📖 文件

https://github.com/StevenKamwaza/Twinify.Docs

💻 原始碼

https://github.com/StevenKamwaza/Twinify

⭐ 如果 Twinify 對您的專案有幫助,請考慮在儲存庫按讚並分享您的回饋。社群貢獻與功能需求皆歡迎。


開心撰寫程式碼!🚀

以 ❤️ 為 .NET 社群打造。


分享您的想法

有問題、功能想法或遷移回饋嗎?

在 GitHub 上開啟 issue 或開始討論 — 我很樂意了解您如何在專案中使用 Twinify。


熱門標籤

dotnet #csharp #dotnet8 #dotnet9 #dotnet10 #opensource #nuget #softwareengineering #backend #webdevelopment #cleanarchitecture #developer #coding #programming #github #aspnetcore #entityframework #architecture #productivity #developers #devcommunity #100DaysOfCode #BuildInPublic #OSS #AutoMapper #Twinify