軽量。馴染みやすい。MITライセンス。 .NET 8、9、10向けに構築。

AutoMapperの最近のライセンス変更に伴い、多くの.NET開発者が、長年のマッピングコードを書き換える必要のないオープンソースの代替手段を探し始めています。

これが、私がTwinifyを構築した理由のひとつです。

Twinifyは軽量で高性能なオブジェクト間マッパーであり、馴染みのあるfluent APIを提供し、DTO、エンティティ、ビューモデル、レコード、複雑なオブジェクトグラフのマッピングを、完全にオープンソースのMIT Licenseのもとで行えます。

すでにAutoMapperを使用している場合、多くの一般的なマッピングシナリオで移行が簡単に行えます。


なぜTwinifyなのか?

✔ MITライセンス

✔ .NET 8、.NET 9、.NET 10向けに構築

✔ 馴染みのあるAutoMapperスタイルのFluent API

✔ 依存性注入のサポート

✔ 自動規約ベースのマッピング

✔ ネストされたオブジェクトとコレクション

✔ フラット化

✔ レコードとコンストラクタマッピング

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から移行する開発者にとって自然に感じられる、馴染みのあるfluent設定モデルを使用しています。


ステップ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は、以下を含む宛先型の自動構築を行います:

  • 不変オブジェクト
  • レコード
  • パラメータ付きコンストラクタ

Fluent設定

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がプロジェクトに役立つ場合は、リポジトリにスターを付け、フィードバックを共有することを検討してください。コミュニティからの貢献や機能リクエストは常に歓迎されます。


Happy Coding! 🚀

.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