Tidak masalah, asalkan itu kelas statis. Ini semua tentang konvensi .
Konvensi kami adalah bahwa setiap "lapisan" (web, layanan, data) memiliki satu file yang disebut AutoMapperXConfiguration.cs
, dengan metode tunggal yang disebut Configure()
, di mana X
layer tersebut.
The Configure()
Metode kemudian memanggil private
metode untuk masing-masing daerah.
Berikut ini contoh konfigurasi tingkat web kami:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
ConfigureUserMapping();
ConfigurePostMapping();
}
private static void ConfigureUserMapping()
{
Mapper.CreateMap<User,UserViewModel>();
}
// ... etc
}
Kami membuat metode untuk setiap "agregat" (Pengguna, Posting), sehingga semuanya dipisahkan dengan baik.
Maka Anda Global.asax
:
AutoMapperWebConfiguration.Configure();
AutoMapperServicesConfiguration.Configure();
AutoMapperDomainConfiguration.Configure();
// etc
Ini seperti "antarmuka kata-kata" - tidak dapat menegakkannya, tetapi Anda mengharapkannya, sehingga Anda dapat membuat kode (dan refactor) jika perlu.
EDIT:
Hanya berpikir saya akan menyebutkan bahwa saya sekarang menggunakan profil AutoMapper , jadi contoh di atas menjadi:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile(new UserProfile());
cfg.AddProfile(new PostProfile());
});
}
}
public class UserProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<User,UserViewModel>();
}
}
Jauh lebih bersih / lebih kuat.
Mapper.Initialize
di setiap kelas Konfigurasi menimpa profil sebelumnya yang ditambahkan? Jika demikian, apa yang harus digunakan alih-alih Inisialisasi?Mapper.CreateMap()
sekarang dihapus.'Mapper.Map<TSource, TDestination>(TSource, TDestination)' is obsolete: 'The static API will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed. Use CreateMapper to create a mapper instance.'
. Bagaimana Anda memperbarui contoh Anda agar sesuai dengan persyaratan baru?Anda dapat benar-benar meletakkannya di mana saja selama proyek web Anda merujuk perakitan yang ada di dalamnya. Dalam situasi Anda, saya akan meletakkannya di lapisan layanan karena akan dapat diakses oleh lapisan web dan lapisan layanan dan kemudian jika Anda memutuskan untuk lakukan aplikasi konsol atau Anda sedang melakukan proyek uji unit konfigurasi pemetaan akan tersedia dari proyek-proyek tersebut juga.
Di Global.asax Anda, Anda kemudian akan memanggil metode yang mengatur semua peta Anda. Lihat di bawah:
File AutoMapperBootStrapper.cs
Global.asax pada awal aplikasi
panggil saja
Sekarang beberapa orang akan menentang metode ini melanggar beberapa prinsip SOLID, yang mereka miliki argumen yang valid. Inilah mereka untuk dibaca.
Mengkonfigurasi Automapper di Bootstrapper melanggar Prinsip Terbuka-Tertutup?
sumber
Pembaruan: Pendekatan yang diposting di sini tidak lagi valid karena
SelfProfiler
telah dihapus pada AutoMapper v2.Saya akan mengambil pendekatan yang sama dengan Thoai. Tapi saya akan menggunakan
SelfProfiler<>
kelas bawaan untuk menangani peta, kemudian menggunakanMapper.SelfConfigure
fungsi untuk menginisialisasi.Menggunakan objek ini sebagai sumber:
Dan ini sebagai tujuannya:
Anda dapat membuat profil ini:
Untuk menginisialisasi aplikasi Anda, buat kelas ini
Tambahkan baris ini ke file global.asax.cs Anda:
AutoMapperConfiguration.Initialize()
Sekarang Anda dapat menempatkan kelas pemetaan Anda di mana mereka masuk akal bagi Anda dan tidak khawatir tentang satu kelas pemetaan monolitik.
sumber
Bagi Anda yang mematuhi hal-hal berikut:
Saya melakukan kombo antara profil dan meningkatkan wadah ioc saya:
Konfigurasi IoC:
Contoh konfigurasi:
Contoh penggunaan:
Imbalannya adalah Anda harus mereferensikan Mapper dengan antarmuka IMappingEngine alih-alih Mapper statis, tapi itu adalah konvensi yang bisa saya jalani.
sumber
Semua solusi di atas menyediakan metode statis untuk memanggil (dari app_start atau di mana saja) bahwa itu harus memanggil metode lain untuk mengonfigurasi bagian pemetaan-konfigurasi. Tetapi, jika Anda memiliki aplikasi modular, modul-modul itu dapat masuk dan keluar dari aplikasi kapan saja, solusi ini tidak berfungsi. Saya sarankan menggunakan
WebActivator
perpustakaan yang dapat mendaftarkan beberapa metode untuk dijalankanapp_pre_start
dan diapp_post_start
mana saja:Anda dapat menginstal
WebActivator
melalui NuGet.sumber
MyModule1
proyek (atau apa pun nama proyek Anda), buat kelas bernamaInitMapInModule1
dan letakkan kode di dalam file; untuk modul lain, lakukan hal yang sama.Selain jawaban terbaik, cara yang baik adalah menggunakan Autofac IoC liberary untuk menambahkan beberapa otomatisasi. Dengan ini, Anda cukup menentukan profil Anda terlepas dari inisiasi.
dan memanggil baris ini dalam
Application_Start
metode:Kode di atas menemukan semua sub kelas Profil dan memulai secara otomatis.
sumber
Menempatkan semua logika pemetaan di 1 lokasi bukanlah praktik yang baik bagi saya. Karena kelas pemetaan akan sangat besar dan sangat sulit untuk dipelihara.
Saya sarankan menempatkan barang pemetaan bersama dengan kelas ViewModel dalam file cs yang sama. Anda dapat dengan mudah menavigasi ke definisi pemetaan yang Anda inginkan setelah konvensi ini. Selain itu, saat membuat kelas pemetaan, Anda bisa merujuk ke properti ViewModel lebih cepat karena mereka berada di file yang sama.
Jadi kelas model tampilan Anda akan terlihat seperti:
sumber
Dari versi baru AutoMapper menggunakan metode statis Mapper.Map () sudah usang. Jadi Anda bisa menambahkan MapperConfiguration sebagai properti statis ke MvcApplication (Global.asax.cs) dan menggunakannya untuk membuat instance Mapper.
App_Start
Global.asax.cs
BaseController.cs
https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API
sumber
Bagi mereka yang (hilang) menggunakan:
Inilah cara saya berhasil mengintegrasikan AutoMapper dalam " cara baru ". Juga, besar berkat ini jawaban (dan pertanyaan)
1 - Membuat folder di proyek WebAPI yang disebut "ProfileMappers". Dalam folder ini saya menempatkan semua kelas profil saya yang membuat pemetaan saya:
2 - Di App_Start saya, saya memiliki SimpleInjectorApiInitializer yang mengkonfigurasi wadah SimpleInjector saya:
3 - Startup.cs
4 - Kemudian, di controller Anda hanya menyuntikkan seperti biasanya antarmuka IMapper:
sumber
Untuk programmer vb.net menggunakan Versi (5.x) AutoMapper yang baru.
Global.asax.vb:
Konfigurasi AutoMapper:
Profil:
Pemetaan:
sumber
Protected Overrides Sub Configure()
sudah usang. Semuanya tetap sama tetapi baris ini harus:Public Sub New()