Özellik adları farklı olduğunda eşleme kuralı nasıl belirtilir


144

Automapper çerçevesine yeni başladım. Aşağıdaki gibi bir etki alanı sınıfı ve bir DTO sınıfı var:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

Not: Sınıfın " Name " özelliğinin adı, Employeesınıfın " FullName " özelliğinin adıyla aynı değildir EmployeeDto.

İşte Employeenesneyi eşlemek için kod EmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

Benim sorum: Employee(kaynak sınıf) ile EmployeeDto(hedef sınıf) eşlemek istiyorsam , eşleme kuralını nasıl belirleyebilirim? Başka bir deyişle, yukarıdaki kod satırıyla (***) nasıl daha fazlasını yapmalıyım?

Yanıtlar:


292

Boş ver, kendim bir çözüm buldum:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
Herhangi bir sınıf için önek / son ek gibi küresel olarak belirtmenin bir yolu var mı? Örneğin, her biri "Yerelleştirme" özelliği olan bir kütüphane fro bir grup sınıf var. Ve onları ilgili özelliğin "LocalizedName" olarak adlandırıldığı sınıflara eşlemek istiyorum. Tek seçeneğim, her eşleme yapılandırmasına ForMember eklemek mi?
NickAb

2
Mapper sınıfında CreateMap yöntemi yok :(
Navid_pdp11

3
@ Navid_pdp11 evet var. Statik sınıf Mapper'ın örnek değil olması gerekir
Jordy van Eijk

@JordyvanEijk Statik bir "CreateMap" yöntemi olan hangi sürümü kullanıyorsunuz? 5.1.1.0'da böyle bir şey yok
Matt Thomas

6
@MattThomas Automapper'ın github'ına bir göz attıktan sonra, sürüm 5.0 CreateMap'in eski olduğunu ve MapperConfiguration veya Mapper'ı kullanmanız gerektiğini söylüyorlar.
Jordy van Eijk

7

Yukarıdaki yorumları Automapper 8.1 + kullanarak güncellenmiş bir yaklaşıma dönüştürmek için ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

Sonra mapConfig öğesini kullanarak harita oluşturucu oluşturursunuz:

var mapper = mapConfig.CreateMapper();

2

Eşleme için Sınıf özelliklerini de belirleyebiliriz

Gönderen https://docs.automapper.org/en/stable/Conventions.html#attribute-support

Özellik Desteği

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Şu anda her zaman açık

Özellikler / Alanlar için SourceToDestinationMapperAttribute örneklerini arar ve üye eşleşmelerini bulmak için kullanıcı tanımlı isMatch işlevini çağırır.

MapToAttribute, sağlanan ada göre mülkle eşleşecek olanlardan biridir.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

İçeriği başka bir yerden alıntı yaparken, okuyucunun içeriğin kopyalandığını açıkça belirtmek için blok alıntı biçimlendirmesini kullandığınızdan emin olun.
TylerH


Stackoverflow için çok yeni. Tabii kuralları takip edecek @TylerH
Pranay DevOps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.