Browse Source

Merge pull request #23621 from abpframework/maliming-patch-2

Change properties from init to set in models
pull/23626/head
Alper Ebiçoğlu 9 months ago
committed by GitHub
parent
commit
b09e889590
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 89
      docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/AutoMapper-Alternatives.md

89
docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/AutoMapper-Alternatives.md

@ -111,35 +111,35 @@ Here are concise, drop-in **side-by-side C# snippets** that map the same model w
We'll use these models to show the mapping examples for AutoMapper, Mapster, AgileMapper. We'll use these models to show the mapping examples for AutoMapper, Mapster, AgileMapper.
```csharp ```csharp
public sealed class Order public class Order
{ {
public int Id { get; init; } public int Id { get; set; }
public Customer Customer { get; init; } = default!; public Customer Customer { get; set; } = default!;
public List<OrderLine> Lines { get; init; } = new(); public List<OrderLine> Lines { get; set; } = new();
public DateTime CreatedAt { get; init; } public DateTime CreatedAt { get; set; }
} }
public sealed class Customer public class Customer
{ {
public int Id { get; init; } public int Id { get; set; }
public string Name { get; init; } = ""; public string Name { get; set; } = "";
public string? Email { get; init; } public string? Email { get; set; }
} }
public sealed class OrderLine public class OrderLine
{ {
public int ProductId { get; init; } public int ProductId { get; set; }
public int Quantity { get; init; } public int Quantity { get; set; }
public decimal UnitPrice { get; init; } public decimal UnitPrice { get; set; }
} }
public sealed class OrderDto public class OrderDto
{ {
public int Id { get; init; } public int Id { get; set; }
public string CustomerName { get; init; } = ""; public string CustomerName { get; set; } = "";
public int ItemCount { get; init; } public int ItemCount { get; set; }
public decimal Total { get; init; } public decimal Total { get; set; }
public string CreatedAtIso { get; init; } = ""; public string CreatedAtIso { get; set; } = "";
} }
``` ```
@ -189,32 +189,53 @@ public partial class OrderMapper
{ {
// Simple property mapping: Customer.Name -> CustomerName // Simple property mapping: Customer.Name -> CustomerName
[MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))] [MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))]
public partial OrderDto ToDto(Order s); public partial OrderDto ToDto(Order source);
// Update an existing target (like MapToExisting) // Update an existing target (like MapToExisting)
[MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))] [MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))]
public partial void UpdateDto(Order s, OrderDto target); public partial void UpdateDto(Order source, OrderDto target);
// Post-process calculated fields (ItemCount, Total, CreatedAtIso) public OrderDto Map(Order s)
// https://mapperly.riok.app/docs/configuration/before-after-map/
[UserMapping(Default = true)]
private static void After(Order s, ref OrderDto d)
{ {
d = d with var d = ToDto(s);
{ AfterMap(s, d);
ItemCount = s.Lines.Sum(l => l.Quantity), return d;
Total = s.Lines.Sum(l => l.Quantity * l.UnitPrice), }
CreatedAtIso = s.CreatedAt.ToString("O")
}; public void Map(Order source, OrderDto d)
{
UpdateDto(source, d);
AfterMap(source, d);
}
private void AfterMap(Order source, OrderDto d)
{
d.ItemCount = source.Lines.Sum(l => l.Quantity);
d.Total = source.Lines.Sum(l => l.Quantity * l.UnitPrice);
d.CreatedAtIso = source.CreatedAt.ToString("O");
} }
} }
//USAGE //USAGE
var mapper = new OrderMapper(); var mapper = new OrderMapper();
var dto = mapper.ToDto(order); var order = new Order
{
Id = 1,
Customer = new Customer { Id = 1, Name = "John Doe", Email = "johndoe@abp.io" },
Lines =
[
new OrderLine {ProductId = 1, Quantity = 2, UnitPrice = 10.0m},
new OrderLine {ProductId = 2, Quantity = 1, UnitPrice = 20.0m}
]
};
// Map to a new object
var dto = mapper.Map(order);
// Map to an existing object
var target = new OrderDto(); var target = new OrderDto();
mapper.UpdateDto(order, target); mapper.Map(order, target);
``` ```
**NuGet Packages:** **NuGet Packages:**

Loading…
Cancel
Save