225 lines
7.0 KiB
Markdown
225 lines
7.0 KiB
Markdown
# 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):
|
|
```csharp
|
|
// 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:**
|
|
```bash
|
|
dotnet restore PowderCoatingApp.sln
|
|
```
|
|
|
|
2. **Build Solution:**
|
|
```bash
|
|
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:**
|
|
```bash
|
|
dotnet nuget locals all --clear
|
|
dotnet restore --force
|
|
```
|
|
|
|
### Issue: Version Conflict
|
|
**Solution:**
|
|
All AutoMapper packages should be the same version. Verify:
|
|
```bash
|
|
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/`:
|
|
```csharp
|
|
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/`:
|
|
```csharp
|
|
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.
|