浏览代码

feat: add automapper

Mariano Z. 1 年之前
父节点
当前提交
a061c42731

+ 3 - 0
Products.API/Program.cs

@@ -6,6 +6,7 @@ using Products.Business.Service;
 
 namespace Products.API;
 
+
 internal class Program
 {
     public static void Main(string[] args)
@@ -20,6 +21,8 @@ internal class Program
         builder.Services.AddScoped<IProductService, ProductService>();
         builder.Services.AddScoped<IProductRepository, ProductRepository>();
         builder.Services.AddDbContext<DataContext>();
+        builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
+
 
 
 

+ 1 - 0
Products.Backoffice/Program.cs

@@ -11,6 +11,7 @@ builder.Services.AddScoped<IProductService, ProductService>();
 builder.Services.AddScoped<IProductRepository, ProductRepository>();
 builder.Services.AddDbContext<DataContext>();
 builder.Services.Configure<RouteOptions>(options => options.LowercaseUrls = true);
+builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
 
 var app = builder.Build();
 

+ 11 - 0
Products.Business/AutoMapperProfiles/DomainToDtoProfile.cs

@@ -0,0 +1,11 @@
+
+using AutoMapper;
+
+public class DomainToDtoProfile : Profile
+{
+    public DomainToDtoProfile()
+    {
+        CreateMap<Products.Business.Domain.Product, Products.Common.Dtos.ProductDto>();
+    }
+}
+

+ 11 - 0
Products.Business/AutoMapperProfiles/DtoToDomainProfile.cs

@@ -0,0 +1,11 @@
+
+using AutoMapper;
+
+public class DtoToDomainProfile : Profile
+{
+
+    public DtoToDomainProfile()
+    {
+        CreateMap<Products.Common.Dtos.ProductDto, Products.Business.Domain.Product>();
+    }
+}

+ 1 - 0
Products.Business/Products.Business.csproj

@@ -12,6 +12,7 @@
 
     <ItemGroup>
         <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="10.0.0" />
+        <PackageReference Include="AutoMapper" Version="13.0.1" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.0" />
     </ItemGroup>
 

+ 11 - 25
Products.Business/Service/ProductService.cs

@@ -1,4 +1,5 @@
 using Microsoft.AspNetCore.JsonPatch;
+using AutoMapper;
 using Products.Business.Domain;
 using Products.Business.Repository;
 using Products.Common.Dtos;
@@ -9,19 +10,20 @@ namespace Products.Business.Service;
 public class ProductService : IProductService
 {
     private readonly IProductRepository _productRepository;
+    private readonly IMapper _mapper;
 
-    // Inject ProductRepository
-    public ProductService(IProductRepository productRepository)
+    // Inject ProductRepository and AutoMapper
+    public ProductService(IProductRepository productRepository, IMapper mapper)
     {
         _productRepository = productRepository;
+        _mapper = mapper;
     }
 
 
     public IEnumerable<ProductDto> GetProducts()
     {
         var products = _productRepository.GetProducts();
-
-        return products.Select(MapProductToProductDto!);
+        return _mapper.Map<List<ProductDto>>(products);
     }
 
 
@@ -29,7 +31,7 @@ public class ProductService : IProductService
     {
         var product = _productRepository.GetProduct(id);
         if (product == null) throw new RecordNotFoundException("Product not found");
-        return MapProductToProductDto(product);
+        return _mapper.Map<ProductDto>(product);
     }
 
     public ProductDto AddProduct(CreateProductDto product)
@@ -41,7 +43,7 @@ public class ProductService : IProductService
             Brand = product.Brand
         });
 
-        return MapProductToProductDto(createdProduct);
+        return _mapper.Map<ProductDto>(createdProduct);
     }
 
 
@@ -64,7 +66,7 @@ public class ProductService : IProductService
 
         _productRepository.UpdateProduct(product);
 
-        return GetProduct(id);
+        return this.GetProduct(id);
     }
 
     public ProductDto PatchProduct(int id,
@@ -74,30 +76,14 @@ public class ProductService : IProductService
         if (product == null) throw new RecordNotFoundException("Product not found");
 
         // Apply the patch
-        var update = new UpdateProductDto(product.Name, product.Color, product.Brand);
+        var update = _mapper.Map<UpdateProductDto>(product);
         productDto.ApplyTo(update);
 
         // Update the product
-        product.Name = update.Name;
-        product.Color = update.Color;
-        product.Brand = update.Brand;
+        _mapper.Map(update, product);
 
         _productRepository.UpdateProduct(product);
 
         return this.GetProduct(id);
     }
-
-
-    // TODO: This can be avoided using AutoMapper, also this should not be in this class
-    private ProductDto MapProductToProductDto(Product product)
-    {
-        return new ProductDto(
-            product.Name,
-            product.Color.ToString(),
-            product.Brand,
-            product.Id
-        );
-    }
-
-
 }

+ 7 - 8
Products.Common/Dtos/CreateProductDto.cs

@@ -3,14 +3,13 @@ using Products.Common.Types;
 
 namespace Products.Common.Dtos;
 
-public class CreateProductDto
-{
+public record CreateProductDto(
     [Required]
-    public required string Name { get; set; }
-    
+     string Name,
+
     [Required]
-    public Color Color { get; set; }
-    
+     Color Color,
+
     [Required]
-    public required string Brand { get; set; }
-}
+    string Brand
+);

+ 1 - 1
Products.Common/Dtos/ProductDto.cs

@@ -5,4 +5,4 @@ public record ProductDto(
         string Color,
         string Brand,
         int Id
-);
+);