-
-
Save VictorSDK/3f783323bb4a06a91df1cecddd3a5d19 to your computer and use it in GitHub Desktop.
using Automapper vs Custom Object Mapper(with reflection) vs Manual Mapper for data transformation of objects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.Reflection; | |
using AutoMapper; | |
public class BaseModel | |
{ | |
public Guid Id { get; set; } | |
public DateTime CreateDate { get; set; } | |
public bool IsActive { get; set; } | |
public string LastUpdatingUserName { get; set; } | |
public DateTime LastUpdatingDate { get; set; } | |
} | |
public class BaseViewModel | |
{ | |
public Guid Id { get; set; } | |
} | |
public class Product | |
: BaseModel | |
{ | |
public string Name { get; set; } | |
public decimal Price { get; set; } | |
public string Description { get; set; } | |
public int Stock { get; set; } | |
} | |
public class ProductViewModel | |
: BaseViewModel | |
{ | |
public string Name { get; set; } | |
public decimal Price { get; set; } | |
public string Description { get; set; } | |
public int Stock { get; set; } | |
} | |
//Helper class for object mapping | |
public static class ObjectMap | |
{ | |
public static TViewModel MapViewModelToModel<TViewModel>(this BaseModel model, TViewModel viewModel) | |
where TViewModel : class | |
{ | |
if (model == null || viewModel == null) | |
return null; | |
Type ModelObjectType = model.GetType(); | |
PropertyInfo[] modelPropList = ModelObjectType.GetProperties(); | |
Type ViewModelType = viewModel.GetType(); | |
PropertyInfo[] viewModelPropList = ViewModelType.GetProperties(); | |
foreach (PropertyInfo modelPropInfo in modelPropList) | |
{ | |
foreach (PropertyInfo viewModelPropInfo in viewModelPropList) | |
{ | |
if (modelPropInfo.Name == viewModelPropInfo.Name && | |
!modelPropInfo.GetGetMethod().IsVirtual && !viewModelPropInfo.GetGetMethod().IsVirtual) | |
{ | |
viewModelPropInfo.SetValue(viewModel, modelPropInfo.GetValue(model, null), null); | |
break; | |
} | |
} | |
} | |
return viewModel; | |
} | |
} | |
// let's use our codes :D | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
Product product = new Product | |
{ | |
Id = Guid.NewGuid(), | |
CreateDate = DateTime.Now, | |
LastUpdatingDate = DateTime.Now, | |
Description = "Description", | |
IsActive = false, | |
LastUpdatingUserName = "YUNUSEMR", | |
Name = "IPHONE 5", | |
Price = 2000, | |
Stock = 13 | |
}; | |
#region data transformation with AutoMapper | |
var config = new MapperConfiguration(cfg => { | |
cfg.CreateMap<Product, ProductViewModel>(); | |
}); | |
IMapper mapper = config.CreateMapper(); | |
var sw = Stopwatch.StartNew(); | |
// can define in bootstrapper class | |
ProductViewModel productViewModel = mapper.Map<Product, ProductViewModel>(product); | |
sw.Stop(); | |
Console.WriteLine("Elapsed time 1 :>" + sw.Elapsed.TotalMilliseconds); | |
Console.WriteLine("with AutoMapper " + productViewModel.Description + " - " + productViewModel.Name); | |
#endregion | |
#region data transformation with Reflection | |
var sw1 = Stopwatch.StartNew(); | |
sw1.Start(); | |
ProductViewModel productViewModel1 = new ProductViewModel(); | |
ObjectMap.MapViewModelToModel<ProductViewModel>(product, productViewModel1); | |
sw1.Stop(); | |
Console.WriteLine("Elapsed time 2 :>" + sw1.Elapsed.TotalMilliseconds); | |
Console.WriteLine("with Reflection " + productViewModel1.Description + " - " + productViewModel1.Name); | |
#endregion | |
#region data transformation manual | |
var sw2 = Stopwatch.StartNew(); | |
sw2.Start(); | |
/*ProductViewModel productViewModel2 = new ProductViewModel() | |
{ | |
Description = product.Description, | |
Id = product.Id, | |
Name = product.Name, | |
Price = product.Price, | |
Stock = product.Stock | |
};*/ | |
ProductViewModel productViewModel2 = new ProductViewModel(); | |
productViewModel2.Description = product.Description; | |
productViewModel2.Id = product.Id; | |
productViewModel2.Name = product.Name; | |
productViewModel2.Price = product.Price; | |
productViewModel2.Stock = product.Stock; | |
sw2.Stop(); | |
Console.WriteLine("Elapsed time 3 :>" + sw2.Elapsed.TotalMilliseconds); | |
Console.WriteLine("with Manual Mapper " + productViewModel1.Description + " - " + productViewModel1.Name); | |
#endregion | |
Console.ReadLine(); | |
} | |
} | |
/* | |
Results | |
Elapsed time 1 :>107.7419 | |
with AutoMapper Description - IPHONE 5 | |
Elapsed time 2 :>2.5482 | |
with Reflection Description - IPHONE 5 | |
Elapsed time 3 :>0.0085 | |
with Manual Mapper Description - IPHONE 5 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment