轻量级。熟悉。MIT 许可。为 .NET 8、9 和 10 构建。
继 AutoMapper 最近的许可变更后,许多 .NET 开发者开始寻找无需重写多年映射代码的开源替代方案。
这就是我构建 Twinify 的原因之一。
Twinify 是一款轻量级、高性能的对象到对象映射器,提供熟悉的流式 API,使映射 DTO、实体、视图模型、记录和复杂对象图变得简单,同时完全开源并采用 MIT 许可。
如果您已经在使用 AutoMapper,您会发现在许多常见映射场景中过渡非常直接。
为什么选择 Twinify?
✔ MIT 许可
✔ 为 .NET 8、.NET 9 和 .NET 10 构建
✔ 熟悉的 AutoMapper 风格流式 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 的开发者来说应该感觉很自然。
步骤 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,包括:
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 构建
Twinify 专注于保持过渡直观,同时继续根据社区反馈不断发展,而不是强迫开发者学习全新的 API。
开始使用
📦 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。

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