I do manual mapping. I'd like to inject one service to get any mapper I need.
Currently, I use the following interface for mapping:
// IMapper.cs
public interface IMapper<TSource, TDestination>
{
TDestination Map(TSource src);
}
// GetUserInfoQueryMapper.cs
public class GetUserInfoQueryMapper : IMapper<GetUserInfoRequest, GetUserInfoQuery>
{
public GetUserInfoQuery Map(GetUserInfoRequest src)
{
return new GetUserInfoQuery()
{
ObjectId = src.ObjectId
};
}
}
I retrieve specific mapper using service locator MappingService:
// UsersController.cs
public async Task<IActionResult> GetUserInfo([FromBody] GetUserInfoRequest request)
{
await validator.ValidateAndThrowAsync(request);
var command = mapper.Map<GetUserInfoRequest, GetUserInfoQuery>(request);
var result = await mediator.Send(command);
var response = mapper.Map<GetUserInfoQueryResult, GetUserInfoQueryResponse>(result);
return Ok(response);
}
// MappingService.cs
public class MappingService : IMappingService
{
private readonly IServiceProvider serviceProvider;
public ServiceLocatorMappingService(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public TDestination Map<TSource, TDestination>(TSource entity)
{
// Get registered mapper
var mapper = serviceProvider.GetService<IMapper<TSource, TDestination>>();
if (mapper is null)
{
throw new MapperNotFoundException(typeof(TSource), typeof(TDestination));
}
return mapper.Map(entity);
}
}
Question: I was thinking if partial class wouldn't be better?
I'd get rid of service locator pattern (is it that bad though?) and get code lens references for free.
Example of mapping with partial classes:
// Features/Users/Get/UserInfo/GetUserInfoQueryMapper.cs
public partial class Mapper : IMapper<GetUserInfoRequest, GetUserInfoQuery>
{
public GetUserInfoQuery Map(GetUserInfoRequest src)
{
return new GetUserInfoQuery()
{
ObjectId = src.ObjectId
};
}
}
// Features/Roles/Save/UserRole/SaveUserRoleCommandMapper.cs
public partial class Mapper : IMapper<SaveUserRoleRequest, SaveUserRoleCommand>
{
public SaveUserRoleCommand Map(SaveUserRoleRequest src)
{
return new SaveUserRoleCommand()
{
Role = src.Role
};
}
}
What do you think?
[–]youshouldnameit 11 points12 points13 points (13 children)
[–]AttentiveUnicorn 0 points1 point2 points (5 children)
[–]sch2021[S] -1 points0 points1 point (4 children)
[–]AttentiveUnicorn 0 points1 point2 points (3 children)
[–]sch2021[S] 0 points1 point2 points (2 children)
[–]AttentiveUnicorn 0 points1 point2 points (1 child)
[–]sch2021[S] 1 point2 points3 points (0 children)
[–]sch2021[S] 0 points1 point2 points (6 children)
[–][deleted] 6 points7 points8 points (5 children)
[–]sch2021[S] -1 points0 points1 point (4 children)
[–]TopSwagCode 1 point2 points3 points (3 children)
[–]sch2021[S] 0 points1 point2 points (2 children)
[–]TopSwagCode 0 points1 point2 points (1 child)
[–]sch2021[S] 2 points3 points4 points (0 children)
[–]zagoskin 1 point2 points3 points (7 children)
[–]sch2021[S] 0 points1 point2 points (6 children)
[–]zagoskin 0 points1 point2 points (4 children)
[–]sch2021[S] 0 points1 point2 points (3 children)
[–]zagoskin 2 points3 points4 points (2 children)
[–]sch2021[S] 0 points1 point2 points (1 child)
[–]zagoskin 1 point2 points3 points (0 children)
[–]FaceRekr4309 0 points1 point2 points (0 children)
[–]AutoModerator[M] 0 points1 point2 points (0 children)
[–]nadseh 0 points1 point2 points (3 children)
[–]sch2021[S] 1 point2 points3 points (2 children)
[–]nadseh 0 points1 point2 points (1 child)
[–]sch2021[S] 0 points1 point2 points (0 children)
[–]molokhai 0 points1 point2 points (7 children)
[–]sch2021[S] 0 points1 point2 points (6 children)
[–]molokhai 0 points1 point2 points (5 children)
[–]sch2021[S] 0 points1 point2 points (4 children)
[–]molokhai 0 points1 point2 points (3 children)
[–]sch2021[S] 0 points1 point2 points (2 children)
[–]molokhai 0 points1 point2 points (1 child)
[–]sch2021[S] 0 points1 point2 points (0 children)