Setiap kali saya mencari hal-hal AutoMapper di StackOverflow, saya membaca sesuatu tentang ValueInjecter .
Bisakah seseorang memberi tahu saya pro dan kontra di antara mereka (kinerja, fitur, penggunaan API, ekstensibilitas, pengujian)?
Setiap kali saya mencari hal-hal AutoMapper di StackOverflow, saya membaca sesuatu tentang ValueInjecter .
Bisakah seseorang memberi tahu saya pro dan kontra di antara mereka (kinerja, fitur, penggunaan API, ekstensibilitas, pengujian)?
Jawaban:
sebagai pencipta ValueInjecter , saya dapat memberitahu Anda bahwa saya melakukannya karena saya menginginkan sesuatu yang sederhana dan sangat fleksibel
Saya benar-benar tidak suka menulis banyak atau menulis banyak monkey code
suka:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter adalah sesuatu seperti mozilla dengan pluginsnya , Anda membuat ValueInjections dan menggunakannya
ada injeksi built-in untuk perataan, tidak rata, dan beberapa yang dimaksudkan untuk diwariskan
dan itu berfungsi lebih baik dalam jenis aspek cara , Anda tidak harus menentukan semua properti 1-ke-1, alih-alih Anda melakukan sesuatu seperti:
ambil semua properti int dari sumber yang namanya diakhiri dengan "Id", ubah nilainya dan tetapkan masing-masing ke properti di objek sumber dengan nama yang sama tanpa akhiran Id dan tipenya diwarisi dari Entity, hal-hal seperti itu
jadi satu perbedaan yang jelas, ValueInjecter digunakan bahkan dalam bentuk windows dengan perataan dan tidak rata, begitulah fleksibelnya
(pemetaan dari objek ke kontrol dan kembali)
Automapper, tidak dapat digunakan dalam bentuk windows, tidak ada cacat, tetapi memiliki hal-hal bagus seperti pemetaan koleksi, jadi jika Anda memerlukannya dengan ValueInjecter Anda hanya melakukan sesuatu seperti:
foos.Select(o => new Bar().InjectFrom(o));
Anda juga dapat menggunakan ValueInjecter untuk memetakan dari anonim dan dinamis obyek
perbedaan:
automapper membuat konfigurasi untuk setiap kemungkinan pemetaan CreateMap ()
valueinjecter menyuntikkan dari objek apa pun ke objek apa pun (ada juga kasus ketika Anda menyuntikkan dari objek ke jenis nilai)
automapper telah meratakannya, dan hanya untuk tipe sederhana atau dari tipe yang sama, dan itu tidak rata
valueinjecter hanya jika Anda membutuhkannya Anda lakukan target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
dan jika Anda inginkan dari Foo.Bar.Name of type String
ke FooBarName of type Class1
Anda mewarisi FlatLoopValueInjection dan menentukan ini
automapper memetakan properti dengan nama yang sama secara default dan untuk sisanya Anda harus menentukan satu per satu, dan melakukan hal-hal seperti Prop1.Ignore (), Prop2.Ignore () dll.
valueinjecter memiliki injeksi default .InjectFrom () yang melakukan properti dengan nama dan tipe yang sama; untuk segala sesuatu yang lain Anda membuat proyeksi nilai kustom Anda dengan logika / aturan pemetaan individual, lebih seperti aspek, misalnya dari semua properti Tipe Foo ke semua properti tipe Bar
<pedant>
Terlihat keren, tapi mungkin itu ValueInjectOr? </pedant>
Karena saya belum pernah menggunakan alat lain, saya hanya dapat berbicara tentang AutoMapper. Saya memiliki beberapa tujuan untuk membangun AutoMapper:
Jika Anda ingin melakukan hal-hal ini, AutoMapper bekerja dengan sangat baik untuk Anda. Hal-hal yang tidak dilakukan AutoMapper dengan baik adalah:
Alasannya saya tidak pernah perlu melakukan hal-hal ini. Sebagian besar, entitas kami tidak memiliki setter, tidak mengekspos koleksi, dll. Jadi itu sebabnya tidak ada. Kami menggunakan AutoMapper untuk meratakan ke DTO dan memetakan dari model UI untuk memerintahkan pesan dan sejenisnya. Di situlah ia bekerja dengan sangat baik untuk kita.
Saya mencoba keduanya dan lebih suka ValueInjecter karena sangat sederhana:
myObject.InjectFrom(otherObject);
Hanya itu yang perlu diketahui untuk sebagian besar kebutuhan injeksi saya. Tidak mungkin menjadi lebih sederhana dan elegan dari ini.
this object
metode penyuluhan di sana?
InjectFrom()
metode ekstensi sendiri.
Ini adalah pertanyaan yang telah saya teliti juga, dan untuk kasus penggunaan saya, sepertinya itu adalah pemberi nilai yang dijatuhkan. Ini tidak memerlukan setup sebelumnya untuk menggunakan (saya kira kinerja, saya kira, meskipun jika diimplementasikan dengan cerdas itu bisa membuat cache pemetaan untuk doa masa depan daripada mencerminkan setiap kali), jadi Anda tidak perlu menentukan terlebih dahulu pemetaan apa pun sebelum menggunakannya.
Namun yang paling penting, ini memungkinkan pemetaan terbalik. Sekarang saya mungkin kehilangan sesuatu di sini karena Jimmy menyebutkan bahwa dia melihat ada use case di mana diperlukan, jadi mungkin saya memiliki pola yang salah, tetapi use case saya adalah saya membuat objek ViewModel dari ORM saya. Saya kemudian menampilkan ini di halaman web saya. Setelah pengguna selesai, saya mendapatkan ViewModel kembali sebagai httppost, bagaimana cara ini dikonversi kembali ke kelas ORM asli? Saya ingin tahu polanya dengan automapper. Dengan ValueInjector itu sepele, dan itu bahkan tidak akan rata. mis. Membuat entitas baru
Model yang dibuat oleh entitas entitas (model pertama):
public partial class Family
{
public int Id { get; set; }
public string FamilyName { get; set; }
public virtual Address Address { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string TownCity { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
public virtual Family Family { get; set; }
}
ViewModel (yang dapat saya hias dengan validator):
public class FamilyViewModel
{
public int Id { get; set; }
public string FamilyName { get; set; }
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressTownCity { get; set; }
public string AddressCounty { get; set; }
public string AddressPostcode { get; set; }
}
ViewController:
//
// GET: /Family/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Family/Create
[HttpPost]
public ActionResult Create(FamilyViewModel familyViewModel)
{
try
{
Family family = new Family();
family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
db.Families.Add(family);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Menurut saya, tidak lebih sederhana dari itu?
(Jadi ini menimbulkan pertanyaan, apa yang salah dengan pola yang saya alami (dan sepertinya banyak yang melakukannya), yang tidak dilihat sebagai nilai bagi AutoMapper?)
Namun, jika pola ini seperti yang diuraikan, adalah salah satu yang ingin Anda gunakan, maka suara saya adalah pemberi nilai oleh mil negara.