軽量。馴染みやすい。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をサポートしています:
CreateMapForMemberMapFromIgnoreConditionConvertUsingBeforeMapAfterMapReverseMapIncludeBasePreserveReferences
マッピングの説明
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をプロジェクトでどのように活用されているかお聞かせいただけると嬉しいです。

0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.