AutoMapper .ForMember nasıl kullanılır?


88

Varlıktan DTO'ya dönüştürmek için AutoMapper'ı kurmaya çalışıyorum. Ben kullanıyor gerektiğini biliyorum .ForMember()sonra Mapper.CreateMap<Entity, DTO>()özel eşlemeleri kurmak, ancak bu kullanılabilir bir yöntem olarak görünmemektedir.

Açıklama için düzenleme: Okuduğum belgelere bir bağlantı veya temel sözdiziminin bir açıklamasını aramıyorum. Cevaplarda ve belgelerde açıklandığı gibi doğru sözdizimini kullanıyorum, örneğin:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

CreateMap <> içinde geçersiz bir tür adım varsa, "ForMember" i geçerli bir yöntem olarak görebiliyorum, fareyle üzerine gelme normalde beklediğim gibi yöntem imzasını gösteriyor. Ama ona iki geçerli tür verir vermez, ForMember, sanki yöntem mevcut değil gibi simgeyi çözemeyeceğini söylüyor.

Karşılaşmadığım genel sınıflar üzerinde bir tür kısıtlama var mı?

Teşekkürler


2
automapper.codeplex.com/… Yapmak istediğiniz şey için muhtemelen en iyi dokümantasyondur. CreateMap çağrısındaki genel parametreleri unutmayın.
Travis

2
Mapper.CreateMap<Source, Dest>()Aşağıdaki tüm cevaplarda atıfta bulunulan statik yöntemlerin artık (2016) geçersiz olarak işaretlendiğine dikkat edilmelidir .
Ben Ripley

Yanıtlar:


132

Aşağıdaki sözdizimini deneyin:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

veya kaynak ve hedef özellikleri aynı ada sahipse, basitçe:

Mapper.CreateMap<Entity, EntityDto>();

Daha fazla ayrıntı ve diğer haritalama senaryoları için lütfen belgelerin ilgili bölümlerine bakın.


1
Benim sorunum, bu bağlamda "ForMember" kullanmaya çalışırken, sanki yöntem yokmuş gibi sadece "'ForMember' sembolü çözülemiyor"
alıyorum

@Nellius, çalışmayan kodunuzu göstermediniz. Çalışan bir örnek gösterdim. Hem kaynak hem de hedef genel sınıfları tanımladığınızdan, projenizde AutoMapper'a başvurduğunuzdan ve belgelerde gösterilen sözdiziminin (ve cevabımda) çalışacağından emin olun.
Darin Dimitrov

4
Aptalca soru, tercih ne anlama geliyor?
riadh gomri

@riadhgomri seçeneği / üye için seçenekler
andrewb

17

Sonunda, bunun ReSharper ile bir tür uyumsuzluk olduğuna inanıyorum.

ReSharper, Automapper kodunun yanlış görüntülenmesine neden olmuş gibi görünüyor, ancak gayet iyi çalışıyor (hata mesajlarıyla kırmızı görüntülemesine rağmen). ReSharper'ın kaldırılması bu sorunu tamamen çözdü.


2
ReSharper'ın hangi sürümü? AutoMapper'ın Hangi Sürümü?
Colin Pear

1
Bu sorunun VisualStudio 2010'da AutoMapper ve ReSharper 8.x'i
dthrasher

benim için aynısı yeniden # 8.2 ile, ancak 2012'ye kıyasla 7.0 ile iyi çalıştı.
Carlos Guillermo Bolaños Lopez

51 artı oyla cevap neden seçilen cevap değil? saçma.
Chris Hawkes

4
Çünkü sorduğum soruya cevap vermedi. Sorum, doğru sözdizimini kullanırken ve her şeyi doğru bir şekilde referans alırken görsel stüdyoda tanınmayan yöntemlerle ilgiliydi. Bunun, yeniden paylaşımla ilgili bir hata olduğu ortaya çıktı. Diğer yanıt, sorduğuma çok benzer bir soruyu yanıtlıyor, ancak aslında sorduğum yanıt tamamen yanlıştı.
Nellius

9

örnek bir uygulama aşağıdaki gibi olacaktır:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

Game ve GameViewModel'in özelliklerinin adları farklı olduğu için bu özelliği eşlemeliyiz - eğer aynı ve aynı türdense ForMember'e ihtiyaç duymayacaktır.

ForMember'ın başka bir kullanımı da Eşlemeleri Yoksaymaktır

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());

1

Bu kullanımın yanı sıra:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

-8

Böyle mi yapıyorsun

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

Bu sayfada bazı iyi örnekler var

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.