Saya relatif baru di .NET, dan saya memutuskan untuk menangani .NET Core daripada belajar "cara lama". Saya menemukan artikel terperinci tentang pengaturan AutoMapper untuk .NET Core di sini , tetapi apakah ada langkah-langkah yang lebih sederhana untuk seorang pemula?
c#
asp.net-core
automapper
theutz
sumber
sumber
Jawaban:
Saya menemukan jawabannya! Berikut detailnya:
Tambahkan Paket Injeksi Ketergantungan AutoMapper ke solusi Anda melalui NuGet .
Buat kelas baru untuk profil pemetaan. (Saya membuat kelas di direktori solusi utama yang disebut
MappingProfile.cs
dan menambahkan kode berikut.) Saya akan menggunakan objekUser
danUserDto
sebagai contoh.Kemudian tambahkan AutoMapperConfiguration di
Startup.cs
seperti yang ditunjukkan di bawah ini:Untuk memohon objek yang dipetakan dalam kode, lakukan sesuatu seperti berikut ini:
Saya harap ini membantu seseorang memulai dengan ASP.NET Core! Saya menyambut setiap umpan balik atau kritik karena saya masih baru di dunia .NET!
sumber
Profile
kelas beradaLangkah Untuk Menggunakan AutoMapper dengan ASP.NET Core.
Langkah 1. Menginstal AutoMapper.Extensions.Microsoft.DependencyInjection dari Paket NuGet.
Langkah 2. Buat Folder di Solusi untuk menjaga Pemetaan dengan Nama "Pemetaan".
Langkah 3. Setelah menambahkan folder Pemetaan kami telah menambahkan kelas dengan Nama " MappingProfile " nama ini dapat menjadi sesuatu yang unik dan baik untuk dipahami.
Di kelas ini, kita akan Mempertahankan semua Pemetaan.
Langkah 4. Menginisialisasi Mapper di Startup "ConfigureServices"
Di Kelas Startup, kita Perlu Menginisialisasi Profil yang telah kita buat dan juga Mendaftar Layanan AutoMapper.
Cuplikan Kode untuk memperlihatkan Metode ConfigureServices di mana kita perlu Menginisialisasi dan Mendaftar AutoMapper.
Langkah 5. Dapatkan Output.
Untuk mendapatkan hasil yang dipetakan kita perlu memanggil AutoMapper.Mapper.Map dan lulus Tujuan dan Sumber yang tepat.
CodeSnippet
sumber
'Mapper' does not contain a definition for 'initialize'
. Saya menggunakanAutoMapper.Extensions.Microsoft.DependencyInjection
versi 7.0.0Saya ingin memperluas jawaban @ theutz - yaitu baris ini:
Ada bug ( mungkin ) di AutoMapper.Extensions.Microsoft.DependencyInjection versi 3.2.0. (Saya menggunakan .NET Core 2.0)
Ini ditangani dalam masalah GitHub ini . Jika kelas Anda mewarisi kelas Profil AutoMapper ada di luar perakitan di mana Anda kelas Startup adalah mereka mungkin tidak akan terdaftar jika injeksi AutoMapper Anda terlihat seperti ini:
kecuali jika Anda secara eksplisit menentukan majelis mana yang akan dicari profil AutoMapper.
Ini dapat dilakukan seperti ini di Startup Anda. Konfigurasi Layanan:
di mana "assemblies" dan "type_in_assemblies" arahkan ke majelis tempat kelas Profile di aplikasi Anda ditentukan. Misalnya:
Saya kira (dan saya menekankan kata ini) bahwa karena mengikuti penerapan parameterless overload (kode sumber dari GitHub ):
kami mengandalkan CLR yang memiliki perakitan JITed yang berisi profil AutoMapper yang mungkin atau mungkin tidak benar karena hanya dipasangkan ketika dibutuhkan (lebih detail dalam pertanyaan StackOverflow ini ).
sumber
jawaban theutz di sini sangat bagus, saya hanya ingin menambahkan ini:
Jika Anda membiarkan profil pemetaan Anda mewarisi
MapperConfigurationExpression
alih-alihProfile
, Anda dapat dengan mudah menambahkan tes untuk memverifikasi pengaturan pemetaan Anda, yang selalu berguna:sumber
Saya memecahkannya dengan cara ini (mirip dengan di atas tetapi saya merasa itu adalah solusi yang lebih bersih) untuk .NET Core 2.2 / Automapper 8.1.1 w / Extensions.DI 6.1.1.
Buat kelas MappingProfile.cs dan isi konstruktor dengan Maps (Saya berencana menggunakan satu kelas untuk menampung semua pemetaan saya)
Di Startup.cs, tambahkan di bawah ini untuk menambahkan ke DI (argumen assembly adalah untuk kelas yang menyimpan konfigurasi pemetaan Anda, dalam kasus saya, ini adalah kelas MappingProfile).
Di Kontroler, gunakan seperti yang Anda lakukan pada objek DI lainnya
sumber
MappingProfiles
dengannew Type[]{}
seperti yang ditunjukkan dalam jawaban ini tidak perlu.Di Startup.cs saya (Core 2.2, Automapper 8.1.1)
Dalam proyek akses data saya
Dalam definisi model saya
sumber
services.AddAutoMapper( typeof(DAL.MapperProfile) );
sajaservices.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });
?Saya suka banyak jawaban, terutama yang @saineshwar. Saya menggunakan .net Core 3.0 dengan AutoMapper 9.0, jadi saya merasa sudah waktunya untuk memperbarui jawabannya.
Apa yang berhasil bagi saya adalah di Startup.ConfigureServices (...) daftarkan layanan dengan cara ini:
Saya pikir sisa jawaban @saineshwar tetap sempurna. Tetapi jika ada yang tertarik kode controller saya adalah:
Dan kelas pemetaan saya:
----- EDIT -----
Setelah membaca dokumen yang terhubung dalam komentar oleh Lucian Bargaoanu, saya pikir lebih baik untuk mengubah jawaban ini sedikit.
Tanpa parameter
services.AddAutoMapper()
(yang memiliki jawaban @saineshwar) tidak berfungsi lagi (setidaknya untuk saya). Tetapi jika Anda menggunakan perakitan NuGet AutoMapper.Extensions.Microsoft.DependencyInjection, kerangka kerja ini dapat memeriksa semua kelas yang memperpanjang AutoMapper.Profile (seperti tambang, MappingProfile).Jadi, dalam kasus saya, di mana kelas milik majelis pelaksana yang sama, pendaftaran layanan dapat dipersingkat menjadi
services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(Pendekatan yang lebih elegan bisa menjadi ekstensi tanpa parameter dengan pengkodean ini).
Terima kasih, Lucian!
sumber
Saya menggunakan AutoMapper 6.1.1 dan asp.net Core 1.1.2.
Pertama-tama, tentukan kelas Profil yang diwarisi oleh Kelas Profil Automapper. Saya Membuat antarmuka IProfile yang kosong, tujuannya hanya untuk menemukan kelas-kelas jenis ini.
Sekarang buat kelas yang terpisah misalnya Pemetaan
Sekarang di Proyek web MVC Core di file Startup.cs, di konstruktor, panggil kelas Pemetaan yang akan menginisialisasi semua pemetaan pada saat memuat aplikasi.
sumber
Untuk ASP.NET Core (diuji menggunakan 2.0+ dan 3.0), jika Anda lebih suka membaca dokumentasi sumber: https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md
Jika tidak, ikuti 4 langkah ini berfungsi:
Instal AutoMapper.Extensions.Microsoft.DependancyInjection dari nuget.
Cukup tambahkan beberapa kelas profil.
Kemudian tambahkan di bawah ini ke kelas startup.cs Anda.
services.AddAutoMapper(OneOfYourProfileClassNamesHere)
Kemudian cukup Suntikkan IMapper di pengontrol Anda atau di mana pun Anda membutuhkannya:
Dan jika Anda ingin menggunakan ProjectTo sekarang cukup:
sumber
Untuk AutoMapper 9.0.0:
Profilperpile:
Di Startup Anda:
Dalam Pengontrol atau layanan: Suntikkan mapper:
Pemakaian:
sumber
Pada versi terbaru dari core asp.net Anda harus menggunakan inisialisasi berikut:
sumber
Asp.Net Core 2.2 dengan AutoMapper.Extensions.Microsoft.DependencyInjection.
Di Startup.cs
sumber
Untuk menambah apa yang disebutkan Arve Systad untuk pengujian. Jika karena alasan apa pun Anda seperti saya dan ingin mempertahankan struktur warisan yang disediakan dalam solusi theutz, Anda dapat mengatur MapperConfiguration seperti:
Saya melakukan ini di NUnit.
sumber
services.AddAutoMapper (); tidak bekerja untuk saya. (Saya menggunakan Asp.Net Core 2.0)
Setelah mengkonfigurasi seperti di bawah ini
inisialisasi mapper IMapper mapper = config.CreateMapper ();
dan menambahkan objek mapper ke layanan sebagai layanan singleton. Tambahkan Adingleton (mapper);
dengan cara ini saya dapat menambahkan DI ke controller
dan saya telah menggunakan seperti di bawah ini dalam metode tindakan saya
sumber
tentang theutz jawaban, tidak perlu menentukan parrameter mapper IMapper pada konstruktor controller.
Anda dapat menggunakan Mapper karena ia adalah anggota statis di sembarang tempat kode.
sumber
IMapper
Anda dapat mengejek itu dan, misalnya, hanya mengembalikannya nol jika tidak relevan untuk tes yang diberikan.