Apakah ada cara untuk memberitahu AutoMapper untuk mengabaikan semua properti kecuali yang dipetakan secara eksplisit?
Saya memiliki kelas DTO eksternal yang cenderung berubah dari luar dan saya ingin menghindari menentukan masing-masing properti untuk diabaikan secara eksplisit, karena menambahkan properti baru akan merusak fungsionalitas (menyebabkan pengecualian) ketika mencoba memetakannya ke objek saya sendiri.
.net
automapper
Igor Brejc
sumber
sumber
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
panggilan) Karena ini, saya menganggap "Abaikan sisanya" sebagai antipattern.Jawaban:
Ini adalah metode ekstensi yang saya tulis yang mengabaikan semua properti yang tidak ada di tujuan. Tidak yakin apakah masih akan berguna karena pertanyaannya sudah lebih dari dua tahun, tetapi saya mengalami masalah yang sama karena harus menambahkan banyak panggilan Abaikan manual.
Pemakaian:
UPDATE : Rupanya ini tidak berfungsi dengan benar jika Anda memiliki pemetaan khusus karena menimpa mereka. Saya kira itu masih bisa berfungsi jika panggilan IgnoreAllNonExisting dulu dan kemudian pemetaan kustom nanti.
schdr memiliki solusi (sebagai jawaban untuk pertanyaan ini) yang digunakan
Mapper.GetAllTypeMaps()
untuk mengetahui properti mana yang belum dipetakan dan mengabaikannya secara otomatis. Sepertinya solusi yang lebih kuat bagi saya.sumber
Dari apa yang saya pahami pertanyaannya adalah bahwa ada bidang di tujuan yang tidak memiliki bidang yang dipetakan di sumbernya, itulah sebabnya Anda mencari cara untuk Mengabaikan bidang tujuan yang tidak dipetakan.
Alih-alih menerapkan dan menggunakan metode ekstensi ini, Anda cukup menggunakan
Sekarang automapper tahu bahwa itu hanya perlu memvalidasi bahwa semua bidang sumber dipetakan tetapi tidak sebaliknya.
Anda juga bisa menggunakan:
sumber
MemberList.Destination
akan memecahkan masalah ops.Saya telah memperbarui ekstensi Can Gencer untuk tidak menimpa peta yang ada.
Pemakaian:
sumber
Mapper.GetAllTypeMaps()
sudah ditinggalkan)Mapper.GetAllTypeMaps()
denganMapper.Configuration.GetAllTypeMaps()
. Berikut ini adalah referensi github.com/AutoMapper/AutoMapper/issues/1252Saya sudah bisa melakukan ini dengan cara berikut:
Catatan: Saya menggunakan AutoMapper v.2.0.
sumber
Versi 5.0.0-beta-1 dari AutoMapper memperkenalkan
ForAllOtherMembers
metode ekstensi sehingga Anda sekarang dapat melakukan ini:Ketahuilah bahwa ada keuntungan untuk memetakan secara eksplisit setiap properti karena Anda tidak akan pernah mendapatkan masalah pemetaan gagal secara diam-diam yang timbul ketika Anda lupa memetakan properti.
Mungkin dalam kasus Anda mungkin bijaksana untuk mengabaikan semua anggota lain dan menambahkan
TODO
untuk kembali dan membuat ini eksplisit setelah frekuensi perubahan pada kelas ini diselesaikan.sumber
ForAllOtherSourceMembers
?Pada AutoMapper 5.0,
.TypeMap
properti onIMappingExpression
sudah tidak ada, artinya solusi 4.2 tidak lagi berfungsi. Saya telah membuat solusi yang menggunakan fungsi asli tetapi dengan sintaks yang berbeda:Penerapan:
sumber
CreateMap<TSource,TDest>()
ekspresi berantai dalamProfile
?Sudah ada beberapa tahun sejak pertanyaan diajukan, tetapi metode ekstensi ini tampak lebih bersih bagi saya, menggunakan versi AutoMapper saat ini (3.2.1):
sumber
Bagi mereka yang menggunakan API non-statis di versi 4.2.0 dan di atas, metode ekstensi berikut (ditemukan di sini di
AutoMapperExtensions
kelas) dapat digunakan:Yang penting di sini adalah bahwa begitu API statis dihapus, kode seperti
Mapper.FindTypeMapFor
itu tidak akan berfungsi lagi, maka penggunaanexpression.TypeMap
bidang tersebut.sumber
expression.TypeMap
tidak lagi tersedia. Inilah solusi saya untuk 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
untuk memperbaiki masalah tipe.Untuk Automapper 5.0 untuk melewati semua properti yang belum dipetakan, Anda hanya perlu memasukkannya
.ForAllOtherMembers (x => x.Ignore ());
di akhir profil Anda.
Sebagai contoh:
Dalam hal ini hanya bidang Id untuk objek output yang akan diselesaikan, semua yang lain akan dilewati. Bekerja seperti pesona, sepertinya kita tidak membutuhkan ekstensi rumit lagi!
sumber
Saya telah memperbarui jawaban Robert Schroeder untuk AutoMapper 4.2. Dengan konfigurasi mapper non-statis, kita tidak dapat menggunakan
Mapper.GetAllTypeMaps()
, tetapiexpression
memiliki referensi ke yang diperlukanTypeMap
:sumber
Bagaimana Anda lebih suka menentukan bahwa anggota tertentu diabaikan? Apakah ada konvensi, atau kelas dasar, atau atribut yang ingin Anda terapkan? Setelah Anda masuk ke bisnis menentukan semua pemetaan secara eksplisit, saya tidak yakin nilai apa yang akan Anda dapatkan dari AutoMapper.
sumber
Ini sepertinya pertanyaan lama tetapi saya pikir saya akan memposting jawaban saya untuk orang lain yang terlihat seperti saya.
Saya menggunakan ConstructUsing, penginisialisasi objek ditambah dengan ForAllMembers abaikan misalnya
sumber
Satu-satunya informasi tentang mengabaikan banyak anggota adalah utas ini - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Saya pikir Anda dapat menggunakan trik yang digunakan dalam ProvidingCommonBaseClassConfiguration untuk mengabaikan properti umum untuk kelas yang sama.
Dan tidak ada informasi tentang fungsi "Abaikan sisanya". Saya telah melihat kode sebelumnya dan menurut saya akan sangat dan sangat sulit untuk menambahkan fungsionalitas tersebut. Anda juga dapat mencoba menggunakan beberapa atribut dan menandainya dengan properti yang diabaikan dan menambahkan beberapa kode umum / umum untuk mengabaikan semua properti yang ditandai.
sumber
Saya tahu ini adalah pertanyaan lama, tetapi @jmoerdyk dalam pertanyaan Anda:
Anda dapat menggunakan jawaban ini seperti ini di dalam profil Ctor
sumber
Anda dapat menggunakan ForAllMembers, daripada hanya menimpa yang diperlukan seperti ini
Hati-hati, itu akan mengabaikan semua, dan jika Anda tidak akan menambahkan pemetaan khusus, mereka sudah diabaikan dan tidak akan berfungsi
juga, saya ingin mengatakan, jika Anda memiliki unit test untuk AutoMapper. Dan Anda menguji bahwa semua model dengan semua properti dipetakan dengan benar, Anda seharusnya tidak menggunakan metode ekstensi tersebut
Anda harus menulis abaikan secara eksplisit
sumber
Solusi saat ini (versi 9) untuk mengabaikan properti yang tidak ada di tipe tujuan adalah membuat pemetaan terbalik dan membalikkannya:
sumber
Dalam versi 3.3.1 Anda cukup menggunakan
IgnoreAllPropertiesWithAnInaccessibleSetter()
atauIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
metode.sumber