ویژگی های پیشرفته ی AutoMapper - قسمت دوم
نویسنده: محمد صاحب
تاریخ: ۱۳۹۱/۰۵/۰۲ ۱۳:۳۴
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class Source
{
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
public class Destination
{
public int Value1 { get; set; }
public DateTime Value2 { get; set; }
public Type Value3 { get; set; }
}
public class BooltoStringTypeConvertor : ITypeConverter<bool, string>
{
public string Convert(ResolutionContext context)
{
return (bool)context.SourceValue ? "Yes" : "No";
}
}
Mapper.CreateMap<bool,string>().ConvertUsing<BooltoStringTypeConvertor>();
Mapper.CreateMap<Product, ProductDto>();
Mapper.AssertConfigurationIsValid();
var product = new Product { Id = 1,Name ="PC" ,InStock = true };
var productDto = Mapper.Map<Product, ProductDto>(product);
نکته: TypeConvertorها میدان دیدشون سراسریه و نیازی نیست به ازای هر نگاشتی اونو به AutoMapper معرفی کنیم Global Scope.
Custom value resolvers
کلاسهای زیر رو در نظر بگیرید
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class PersonDTO
{
public int Id { get; set; }
public string RawData { get; set; }
}
public class CommaDelimetedResolver:ValueResolver<Person,string>
{
protected override string ResolveCore(Person source)
{
return string.Join(",", source.Id, source.FirstName, source.LastName);
}
}
Mapper.CreateMap<Person, PersonDTO>().ForMember(
des => des.RawData, op => op.ResolveUsing<CommaDelimetedResolver>());
var person = new Person
{
Id = 1,
FirstName = "Mohammad",
LastName = "Saheb",
};
var personDTO = Mapper.Map<Person, PersonDTO>(person);
public class ShamsiFormatter:IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
return ToShamsi(context.SourceValue.ToString());
}
}
Mapper.CreateMap<Person, PersonDTO>().ForMember(
des => des.ShamsiDate, op => op.AddFormatter<ShamsiFormatter>());
private TollContext db = new TollContext();
private IQueryable<CarDTO> MapCars()
{
return from p in db.Cars select new CarDTO() { Id = p.Id, Name = p.Name, Price = p.Price };
}
public IEnumerable<CarDTO> GetCars()
{
return MapCars().AsEnumerable();
}
private TollContext db = new TollContext();
private IQueryable<CarDto> MapCars()
{
return Mapper.Map<Car, CarDto>(db.Cars);
}
public IEnumerable<CarDto> GetCars()
{
return MapCars().AsEnumerable();
}
public class SourceType1 //poco class
{
public string Name
public string JobTitle
public string PetsName
}
public class SourceType2
{
public string BankName
public decimal CreditCardBalance
public DateTime SignupDate
}
public class Destination
{
public string Job
public string Balance //thousand seprator
}
var Destination = EntityMapper.Map<Destination>(SourceType1, SourceType2);
public class Kala {
[Key]
public int Kala_id { get; set; }
[DisplayName("نام کالا")]
public string Name { get; set; }
[DisplayName("قیمت خرید")]
public double Fee_Kharid { get; set; }
public virtual Brand Brand { get; set; }
}
public class Brand
{
[Key]
public int Brand_id { get; set; }
public string Brand_Name { get; set; }
public virtual ICollection<Kala> Kalas { get; set; }
}
public class KalaViewModel
{
public int Kala_Id { get; set; }
public string Name { get; set; }
public double Fee_Kharid { get; set; }
public string Brand_Name { get; set; }
}
//Controller
[HttpGet]
public ActionResult Index()
{
var kala = _Kala_Service.GetAllKalas();
var brand = _Brand_Service.GetAllBrands();
var kalaviewmodel = EntityMapper.Map<List<KalaViewModel>>(kala, brand);
return View(kalaviewmodel);
}
protected override void Configure()
{
Mapper.CreateMap<Kala, KalaViewModel>();
Mapper.CreateMap<Brand, KalaViewModel>()
.ForMember(des => des.Kala_Id, op => op.Ignore())
.ForMember(des => des.Name, op => op.Ignore())
.ForMember(x => x.Fee_Kharid, opt => opt.Ignore());
}public class Kala
{
[Key]
public int Kala_id { get; set; }
[DisplayName("نام کالا")]
public string Name { get; set; }
[DisplayName("قیمت خرید")]
public double Fee_Kharid { get; set; }
public virtual Brand Brand { get; set; }
}
public class Brand
{
[Key]
public int Brand_id { get; set; }
public string Brand_Name { get; set; }
public virtual ICollection<Kala> Kalas { get; set; }
}
public class KalaViewModel
{
public int Kala_Id { get; set; }
public string Name { get; set; }
public double Fee_Kharid { get; set; }
public string Brand_Name { get; set; }
}
//Controller
[HttpGet]
public ActionResult Index()
{
var kala = _Kala_Service.GetAllKalas();
var brand = _Brand_Service.GetAllBrands();
var kalaviewmodel = EntityMapper.Map<List<KalaViewModel>>(kala, brand);
return View(kalaviewmodel);
}
protected override void Configure()
{
Mapper.CreateMap<Kala, KalaViewModel>()
.ForMember(des => des. Brand_Name, op => op.MapFrom(src => src.Brand.Brand_Name) );
}Mapper.CreateMap<Kala, KalaViewModel>()
.ForMember(des => des.Brand_Name, op => op.MapFrom(src => src.Brand.Brand_Name));
var kalas = new[]
{
new Kala
{
Kala_id = 1,
Brand = new Brand {Brand_id = 1, Brand_Name = "Nike"},
Fee_Kharid = 150000,
Name = "Shoes"
},new Kala
{
Kala_id = 2,
Brand = new Brand {Brand_id = 1, Brand_Name = "Nike"},
Fee_Kharid = 12000,
Name = "Shirt"
}
};
var kalaviewmodel = Mapper.Map<Kala[], KalaViewModel[]>(kalas); public class Kala
{
[Key]
public int Kala_id { get; set; }
[DisplayName("نام کالا")]
public string Name { get; set; }
[DisplayName("قیمت خرید")]
public double Fee_Kharid { get; set; }
public virtual Brand Brand { get; set; }
public ICollection<Anbar_Kala> Anbar_Kalas { get; set; }
}
public class Anbar_Kala
{
[ForeignKey("Anbar_Id")]
public virtual Anbar Anbar { get; set; }
public int Anbar_Id { get; set; }
[ForeignKey("Kala_Id")]
public virtual Kala Kala{ get; set; }
public int Kala_Id { get; set; }
[DisplayName("تعداد")]
public int Tedad { get; set; } //تعداد کالاها در هر انبار
}
public class KalaViewModel
{
public int Kala_Id { get; set; }
public string Name { get; set; }
public double Fee_Kharid { get; set; }
public string Brand_Name { get; set; }
public int Tedad { get; set; }
}
//controller
var kala = _Kala_Service.GetAllKalas();
var tedad= _Anbar_Kala_Service.GetAllAnbar_Kalas();
var kalaviewmodel = EntityMapper.Map<List<KalaViewModel>>(kala, tedad);
protected override void Configure()
{
Mapper.CreateMap<Kala, KalaViewModel>()
.ForMember(des => des.Brand_Name, op => op.MapFrom(src => src.Brand.Brand_Name));
Mapper.CreateMap<Anbar_Kala, KalaViewModel>(); // این نگاشت باید به چه صورتی باشد؟
.ForMember(des =>des.Kala_Id, op=>op.Ignore();
}public class Anbar_KalaViewModel
{
public Anbar Anbar { get; set; }
public Kala Kala{ get; set; }
public int Tedad { get; set; }
}
//Class Configure
Mapper.CreateMap<Anbar_Kala,Anbar_KalaViewModel>(); public class ProductType:BaseEntity
{
#region Field
private string persianTitle;
private string englishTitle;
private IList<Product> products;
#endregion
#region Memebr
public string PersianTitle
{
get
{
return (persianTitle);
}
set
{
persianTitle = Microsoft.Security.Application.Encoder.HtmlEncode(value);
}
}
public string EnglishTitle
{
get
{
return (englishTitle);
}
set
{
englishTitle = Microsoft.Security.Application.Encoder.HtmlEncode(value);
}
}
public virtual IList<Product> Products
{
get
{
return (products);
}
set
{
products = value;
}
}
#endregion
}
[HttpPost]
public ActionResult Update(ProductTypeViewModel productTypeViewModel)
{
if (productTypeViewModel.ExaminId())
{
ProductType productType;
productType = _productType.Find(x => x.Id == productTypeViewModel.Id);
AutoMapper.Mapper.Map(productTypeViewModel, productType);
_uow.SaveChanges();
}
return RedirectToAction("Index");
}
issing type map configuration or unsupported mapping. Mapping types: ProductTypeViewModel -> ProductType_5334DF7BAFBE780DF5328E2D6DF2A0DC3350F23340BE2EE2FC506AE9EDEC38DA MvcUserInterface.Areas.Management.Models.ProductTypeViewModel -> System.Data.Entity.DynamicProxies.ProductType_5334DF7BAFBE780DF5328E2D6DF2A0DC3350F23340BE2EE2FC506AE9EDEC38DA Destination path: ProductType_5334DF7BAFBE780DF5328E2D6DF2A0DC3350F23340BE2EE2FC506AE9EDEC38DA Source value: MvcUserInterface.Areas.Management.Models.ProductTypeViewModel
public class Customer
{
public Customer()
{
Orders = new List<Order>();
}
[StringLength(10)]
public string Title { get; set; }
[Display(Name = "نام")]
public string FirstName { get; set; }
[Display(Name = "نام خانوادگی")]
public string LastName { get; set; }
public ICollection<Order> Orders { get; set; }
}public class CustomerViewModel
{
public Customer Customer{ get; set; }
}Mapper.CreateMap<Customer, CustomerCreateVM>()
.ForMember(f => f.Date, f => f.AddFormatter<PersianDateFormatter>());Mapper.CreateMap<CustomerCreateVM, Customer>()
.ForMember(f => f.Date, f => f.AddFormatter<DateTimeFormatter>());