AutoMapper thương mại hóa - tìm hiểu các phương án thay thế

Công nghệ - 09/04/2025 07:24:00

AutoMapper chính thức thương mại hóa từ 2/4/2025, khiến nhiều team .NET lo ngại. Vậy đâu là lựa chọn thay thế tốt nhất cho dự án mã nguồn mở, startup hay hệ thống hiệu năng cao? Bài viết sẽ giúp bạn giải đáp!

AutoMapper, một thư viện ánh xạ đối tượng phổ biến trong hệ sinh thái .NET, đã thông báo chuyển sang mô hình thương mại hóa vào ngày 2 tháng 4 năm 2025, theo bài viết của Jimmy Bogard. Điều này có nghĩa là AutoMapper sẽ không còn miễn phí hoàn toàn như trước, gây ra lo ngại cho cộng đồng developer, đặc biệt là những người sử dụng trong các dự án mã nguồn mở hoặc ngân sách hạn chế. Do đó, việc tìm kiếm các phương án thay thế trở nên cần thiết.

Trong bài viết này, tôi sẽ tập trung vào ba lựa chọn: Manual Mapping, Mapster, AgileMapper, và mapping từng property trong các class (manual mapping), so sánh chúng về hiệu suất và cung cấp hướng dẫn chi tiết để triển khai.


1. Manual Mapping (Mapping từng property)

Manual mapping là phương pháp ánh xạ đối tượng bằng cách viết code trực tiếp để sao chép từng property từ đối tượng nguồn sang đối tượng đích. Phương pháp này không sử dụng bất kỳ thư viện nào như AutoMapper, Mapster hay AgileMapper. Mặc dù yêu cầu nhiều code hơn, nhưng nó có thể mang lại hiệu suất cao hơn do không có overhead từ các thư viện.

Hiệu suất của manual mapping:

  • Manual mapping không gây ra phân bổ bộ nhớ trên heap khi sử dụng records hoặc record structs, giúp giảm thiểu áp lực cho garbage collector.
  • Một so sánh trên Medium cho thấy manual mapping là phương pháp nhanh nhất so với các mapper khác như Mapperly, Mapster, AutoMapper, TinyMapper và Implicit Operator.

Hướng dẫn triển khai chi tiết: Manual mapping có thể được thực hiện theo nhiều cách:

  • Ví dụ 1 - Constructor: Tạo constructor trong class đích để nhận đối tượng nguồn và ánh xạ các property
Nội dung bài viết

  • Ví dụ 2 - Method:

 

Nội dung bài viết

  • Ví dụ 3 - Record Structs (Hiệu suất tốt nhất)

 

Nội dung bài viết

  • Ví dụ 4 - Extension Method: Tạo extension methods cho việc ánh xạ

 

Nội dung bài viết

Khi nào nên sử dụng phương án này

  • Trong các dự án yêu cầu hiệu suất cao (ví dụ: ánh xạ hàng nghìn hoặc triệu đối tượng mỗi giây).
  • Khi logic ánh xạ phức tạp và cần kiểm soát chi tiết.
  • Trong các dự án nhỏ hoặc đội ngũ nhỏ không muốn phụ thuộc vào thư viện bên thứ ba.

2. Mapster

Mapster là một thư viện ánh xạ đối tượng được phát triển bởi MapsterMapper, với hơn 7,4 triệu lượt tải xuống trên NuGet (NuGet Gallery | Mapster 7.4.0). Nó được thiết kế để có hiệu suất cao và dễ sử dụng, với mục tiêu thay thế AutoMapper trong các tình huống yêu cầu tốc độ nhanh.

Đặc điểm nổi bật:

  • Theo bài viết trên Code Maze https://code-maze.com/automapper-vs-mapster-dotnet/, Mapster nhanh hơn AutoMapper từ 5-10 lần trong một số kịch bản, sử dụng chỉ 1/3 bộ nhớ so với AutoMapper.
  • Hỗ trợ dependency injection trong ASP.NET Core, với package bổ sung Mapster.DependencyInjection.
  • Có khả năng ánh xạ queryables, giúp giảm thiểu mã code khi làm việc với Entity Framework.

Hướng dẫn triển khai chi tiết:

  • Cài đặt: Có thể cài đặt qua NuGet Package Manager (Install-Package Mapster) hoặc .NET CLI (dotnet add package Mapster).
  • Ánh xạ cơ bản: Sử dụng phương thức Adapt:

Tạo đối tượng mới: ```var destObject = sourceObject.Adapt<Destination>();```

Ánh xạ vào đối tượng hiện có: ```sourceObject.Adapt(destObject);```

  • Trong ASP.NET Core: Thêm vào service collection với ```services.AddMapster();```, sau đó inject IMapper vào service.
  • Ánh xạ queryables: Sử dụng ProjectToType
Nội dung bài viết

3. AgileMapper

AgileMapper, được phát triển bởi agileobjects, là một thư viện ánh xạ với triết lý "zero-configuration", nghĩa là không cần cấu hình ban đầu nhưng vẫn cung cấp khả năng tùy chỉnh cao. Nó hỗ trợ .NET 3.5+ và .NET Standard 1.0+, với hơn 343 nghìn lượt tải xuống trên NuGet (NuGet Gallery | AgileObjects.AgileMapper 1.8.1).

Đặc điểm nổi bật:

  • Zero-configuration: Có thể ánh xạ tự động giữa các đối tượng mà không cần cấu hình.
  • Hỗ trợ nhiều loại ánh xạ: Flattening, unflattening, deep cloning, merging, và projecting queries.
  • Hiệu suất "comparable" với các mapper khác, nhanh hơn AutoMapper trong một số kịch bản, theo bài viết https://agileobjects.co.uk/object-mapper-performance-comparison.
  • Có khả năng xem kế hoạch thực thi (execution plans), giúp debug dễ dàng hơn.

Hướng dẫn triển khai chi tiết:

  • Cài đặt: Install-Package AgileObjects.AgileMapper.
  • Ánh xạ cơ bản: Sử dụng Mapper.Map hoặc extension methods:

```var customer = Mapper.Map(customerViewModel).ToANew<Customer>();```

Hoặc: ```var customer = customerViewModel.Map().ToANew<Customer>();```

  • Ánh xạ queryables: Sử dụng Project:
Nội dung bài viết

So sánh chi tiết về hiệu suất

Dưới đây là bảng so sánh hiệu suất giữa các phương án:

Nội dung bài viết

  • Manual mapping nổi bật với hiệu suất cao nhất, đặc biệt trong các kịch bản yêu cầu tốc độ nhanh và không phân bổ bộ nhớ.
  • Mapster là lựa chọn tốt nhất cho các dự án cần hiệu suất cao nhưng vẫn muốn sử dụng thư viện.
  • AgileMapper phù hợp cho các dự án cần linh hoạt và không muốn cấu hình ban đầu.
  • AutoMapper: tạm thời bỏ qua

Kết luận và khuyến nghị sử dụng

Khi AutoMapper chuyển sang mô hình thương mại hóa, các phương án thay thế như Mapster, AgileMapper và manual mapping đều có thể đáp ứng nhu cầu của các developer .NET. Lựa chọn phụ thuộc vào yêu cầu cụ thể của dự án:

  • Nếu hiệu suất là ưu tiên hàng đầu, manual mapping là lựa chọn tốt nhất, đặc biệt với record structs <= Đây là phương án tôi lựa chọn, kết hợp với ChatGPT
  • Nếu bạn muốn một thư viện với hiệu suất cao nhưng vẫn dễ sử dụng, Mapster là lựa chọn lý tưởng.
  • Nếu bạn cần một giải pháp zero-configuration với khả năng tùy chỉnh cao, AgileMapper là phù hợp.

Hãy kiểm tra phiên bản mới nhất của các thư viện này trên NuGet và đánh giá kỹ lưỡng trước khi áp dụng vào dự án thực tế nhé.

Happy coding.

/Son Do

 

#DotNet #NETCore #AutoMapper #ObjectMapping #PerformanceOptimization #SoftwareDevelopment #CSharp #CodingTips #TechBlog #Programming #CodeEfficiency #OpenSource #TechSolutions #SoftwareEngineering

#wecommit100share #1percentbetter

Công nghệ

Xem tất cả