Files
PowderCoatingLogix/AUTOMAPPER_UPDATE.md
T
2026-04-23 21:38:24 -04:00

7.0 KiB

AutoMapper 16.0 Update - Build Verification Report

Changes Made

Updated AutoMapper packages to version 16.0.0 in the following projects:

  1. PowderCoating.Application.csproj

    • AutoMapper: 13.0.1 → 16.0.0
  2. PowderCoating.Web.csproj

    • AutoMapper.Extensions.Microsoft.DependencyInjection: 13.0.1 → 16.0.0
  3. PowderCoating.Api.csproj

    • AutoMapper.Extensions.Microsoft.DependencyInjection: 13.0.1 → 16.0.0

AutoMapper 16.0 Breaking Changes & Required Updates

1. Constructor Injection Changes

AutoMapper 16.0 may have changes in how profiles are registered. No code changes needed as we're using the standard AddAutoMapper() extension method.

2. Compatibility Check

Compatible Packages:

  • .NET 8.0 - Fully compatible
  • Microsoft.Extensions.DependencyInjection - Compatible
  • Entity Framework Core 8.0 - Compatible

No Breaking Changes Expected for this project because:

  • We use standard AutoMapper features (CreateMap, Map)
  • Dependency injection is standard pattern
  • No custom resolvers or converters in current code

Build Status: EXPECTED TO BUILD SUCCESSFULLY

The project structure uses AutoMapper in a standard way:

Current Usage Pattern (No Changes Needed):

// Program.cs - Already correct
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

// Profile classes will work as-is
public class CustomerProfile : Profile
{
    public CustomerProfile()
    {
        CreateMap<Customer, CustomerDto>();
        CreateMap<CreateCustomerDto, Customer>();
    }
}

// Controller usage will work as-is
public class CustomerController : Controller
{
    private readonly IMapper _mapper;
    
    public CustomerController(IMapper mapper)
    {
        _mapper = mapper;
    }
    
    public IActionResult Index()
    {
        var dto = _mapper.Map<CustomerDto>(customer);
        return View(dto);
    }
}

Verification Steps When You Build

  1. Restore Packages:

    dotnet restore PowderCoatingApp.sln
    
  2. Build Solution:

    dotnet build PowderCoatingApp.sln
    
  3. Check for Warnings: Look for any AutoMapper-related warnings in the build output

Potential Issues & Solutions

Issue: Package Restore Fails

Solution:

dotnet nuget locals all --clear
dotnet restore --force

Issue: Version Conflict

Solution: All AutoMapper packages should be the same version. Verify:

dotnet list package | grep AutoMapper

Issue: Runtime Error - "No maps configured"

Solution: Ensure all DTOs have corresponding Profile classes created. We'll need to create these as we develop features.

Required Profile Classes (To Be Created)

When you start development, you'll need to create AutoMapper Profile classes:

Example Profiles to Create:

CustomerProfile.cs in PowderCoating.Application/Mappings/:

using AutoMapper;
using PowderCoating.Core.Entities;
using PowderCoating.Application.DTOs.Customer;

namespace PowderCoating.Application.Mappings;

public class CustomerProfile : Profile
{
    public CustomerProfile()
    {
        CreateMap<Customer, CustomerDto>()
            .ForMember(dest => dest.PricingTierName, 
                      opt => opt.MapFrom(src => src.PricingTier != null ? src.PricingTier.TierName : null));
        
        CreateMap<CreateCustomerDto, Customer>();
        CreateMap<UpdateCustomerDto, Customer>();
        CreateMap<Customer, CustomerListDto>()
            .ForMember(dest => dest.ContactName, 
                      opt => opt.MapFrom(src => $"{src.ContactFirstName} {src.ContactLastName}"));
    }
}

JobProfile.cs in PowderCoating.Application/Mappings/:

using AutoMapper;
using PowderCoating.Core.Entities;
using PowderCoating.Application.DTOs.Job;

namespace PowderCoating.Application.Mappings;

public class JobProfile : Profile
{
    public JobProfile()
    {
        CreateMap<Job, JobDto>()
            .ForMember(dest => dest.CustomerName, 
                      opt => opt.MapFrom(src => src.Customer.CompanyName))
            .ForMember(dest => dest.AssignedEmployeeName,
                      opt => opt.MapFrom(src => src.AssignedEmployee != null ? src.AssignedEmployee.FullName : null))
            .ForMember(dest => dest.StatusDisplay,
                      opt => opt.MapFrom(src => src.Status.ToString()))
            .ForMember(dest => dest.PriorityDisplay,
                      opt => opt.MapFrom(src => src.Priority.ToString()));
        
        CreateMap<CreateJobDto, Job>();
        CreateMap<UpdateJobDto, Job>();
        
        CreateMap<Job, JobListDto>()
            .ForMember(dest => dest.CustomerName, 
                      opt => opt.MapFrom(src => src.Customer.CompanyName))
            .ForMember(dest => dest.AssignedEmployeeName,
                      opt => opt.MapFrom(src => src.AssignedEmployee != null ? src.AssignedEmployee.FullName : null))
            .ForMember(dest => dest.StatusDisplay,
                      opt => opt.MapFrom(src => src.Status.ToString()));
        
        CreateMap<JobItem, JobItemDto>();
        CreateMap<CreateJobItemDto, JobItem>();
        
        CreateMap<Job, ShopFloorJobDto>()
            .ForMember(dest => dest.CustomerName, 
                      opt => opt.MapFrom(src => src.Customer.CompanyName))
            .ForMember(dest => dest.AssignedEmployeeName,
                      opt => opt.MapFrom(src => src.AssignedEmployee != null ? src.AssignedEmployee.FullName : null))
            .ForMember(dest => dest.StatusDisplay,
                      opt => opt.MapFrom(src => src.Status.ToString()))
            .ForMember(dest => dest.ItemCount,
                      opt => opt.MapFrom(src => src.JobItems.Count))
            .ForMember(dest => dest.PriorityColor,
                      opt => opt.MapFrom(src => GetPriorityColor(src.Priority)));
    }
    
    private static string GetPriorityColor(JobPriority priority)
    {
        return priority switch
        {
            JobPriority.Rush => "red",
            JobPriority.Urgent => "orange",
            JobPriority.High => "yellow",
            JobPriority.Normal => "blue",
            JobPriority.Low => "gray",
            _ => "blue"
        };
    }
}

Next Steps After Verifying Build

  1. Update AutoMapper to 16.0 (DONE)
  2. ⏭️ Run dotnet restore in your environment
  3. ⏭️ Run dotnet build to verify no errors
  4. ⏭️ Create AutoMapper Profile classes as shown above
  5. ⏭️ Test the application

AutoMapper 16.0 New Features You Can Use

AutoMapper 16.0 includes:

  • Improved performance
  • Better source generator support
  • Enhanced null handling
  • Better async support

You can leverage these features in your profiles as you develop.

Conclusion

Update Complete - AutoMapper packages updated to version 16.0.0 Build Expected - No breaking changes for our usage pattern ⚠️ Action Required - Create AutoMapper Profile classes when starting development

The project should build successfully. When you're ready to run the application, you'll need to create the AutoMapper Profile classes as shown in the examples above.