Sometimes, I need to map from a Domain entity to a ViewModel - to display information.
Other times, I need to map from a ViewModel to a Domain entity - for persistance of data.
Is this kosher or does this code smell?
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
MapObjects();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
private void MapObjects()
{
Mapper.CreateMap<UserModel, User>();
Mapper.CreateMap<ProductBrandModel, ProductBrand>();
Mapper.CreateMap<ProductBrand, ProductBrandModel>();
Mapper.CreateMap<ProductCategoryModel, ProductCategory>();
Mapper.CreateMap<ProductCategory, ProductCategoryModel>();
}
3 Answers 3
Mapping to and from domain models and view models is exactly what automapper is designed for.
Automapper ReverseMap
This is a more succint way to register your classes. Automapper
is able to create a two-way mapping expression using ReverseMap
.
private void MapObjects()
{
Mapper.CreateMap<UserModel, User>();
Mapper.CreateMap<ProductBrandModel, ProductBrand>().ReverseMap();
Mapper.CreateMap<ProductCategoryModel, ProductCategory>().ReverseMap();
}
As opposed to the mirrored registration..
private void MapObjects() { Mapper.CreateMap<UserModel, User>(); Mapper.CreateMap<ProductBrandModel, ProductBrand>(); Mapper.CreateMap<ProductBrand, ProductBrandModel>(); Mapper.CreateMap<ProductCategoryModel, ProductCategory>(); Mapper.CreateMap<ProductCategory, ProductCategoryModel>(); }
This looks fine to me although you may want to extract it out in to a separate class if it starts to get bigger. I usually end up with an Init (or similar) folder with classes for IOC, ORM, Mapper and Routes (if they get big enough). Once out of the Global.asax you can test them if needed as well (not required for basic mappings in your example of course).
Rename it to RegisterViewMapper()
or similar and it will smell less.
ProductBrandModel
andProductBrand
on a whiteboard showing their relationships, then see if you can't turn make the relationships one way by breaking either of them up such that no two-way relationship exists between any of the classes on the whiteboard. \$\endgroup\$