Her zaman StackOverflow AutoMapper şeyler arıyorum , ValueInjecter hakkında bir şey okuyorum .
Birisi bana aralarındaki artıları ve eksileri söyleyebilir mi (performans, özellikler, API kullanımı, genişletilebilirlik, test)?
Her zaman StackOverflow AutoMapper şeyler arıyorum , ValueInjecter hakkında bir şey okuyorum .
Birisi bana aralarındaki artıları ve eksileri söyleyebilir mi (performans, özellikler, API kullanımı, genişletilebilirlik, test)?
Yanıtlar:
ValueInjecter'in yaratıcısı olarak, bunu yaptığımı söyleyebilirim çünkü basit ve çok esnek bir şey istedim
Gerçekten çok fazla yazmayı veya çok fazla yazmayı monkey code
sevmiyorum:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter, eklentileriyle mozilla gibi bir şeydir , ValueInjections oluşturur ve bunları kullanırsınız.
düzleştirme, düzleştirme ve miras alınması amaçlanan yerleşik enjeksiyonlar vardır
ve en-boy oranıyla daha iyi çalışır , tüm özellikleri 1'e 1 olarak belirtmeniz gerekmez, bunun yerine şöyle bir şey yaparsınız:
adın "Id" ile biten tüm int özelliklerini alın, değeri dönüştürün ve her birini kaynak sonekini Id soneki olmadan aynı ada sahip bir özelliğe ayarlayın ve türü Entity'den devralınır, bunun gibi şeyler
bu yüzden bariz bir fark olan ValueInjecter, düzleştirici ve düzleştiricili pencerelerde bile kullanılır, bu ne kadar esnektir
(nesneden form denetimlerine ve geriye eşleme)
Automapper, Windows formlarında kullanılamaz, düzleştirilmez, ancak koleksiyon eşleme gibi iyi şeylere sahiptir, bu nedenle ValueInjecter ile ihtiyacınız olması durumunda şöyle bir şey yaparsınız:
foos.Select(o => new Bar().InjectFrom(o));
anonim ve dinamik nesnelerden eşlemek için ValueInjecter'i de kullanabilirsiniz
farklar:
automapper her eşleme olasılığı için yapılandırma oluştur CreateMap ()
valueinjecter herhangi bir nesneden herhangi bir nesneye enjekte edilir (nesneden valueetype'a enjekte ettiğiniz durumlar da vardır)
automapper düzleştirdi ve sadece basit tipler için veya aynı tipte ve düzleştirici değil
valueinjecter yalnızca ihtiyacınız target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
varsa Foo.Bar.Name of type String
ve FooBarName of type Class1
sizden FlatLoopValueInjection kaynağını devralmak istiyorsanız bunu belirtin ve belirtin
automapper varsayılan olarak aynı ada sahip özellikleri eşler ve geri kalanı için tek tek belirtmeniz ve Prop1.Ignore (), Prop2.Ignore () vb.
valueinjecter, aynı ada ve türe sahip özellikleri yapan varsayılan bir .InjectFrom () yöntemine sahiptir; Diğer her şey için, özel değer enjeksiyonlarınızı, örneğin Foo Tipi tüm sahne alanlarından, Tip Bar'ın tüm sahne kısımlarına kadar , daha farklı yönlere sahip olan bireysel haritalama mantığı / kuralları ile oluşturursunuz.
<pedant>
Havalı görünüyor, ama belki ValueInjectOr olmalı? </pedant>
Diğer araçlardan daha önce hiç kullanmadığımdan sadece AutoMapper hakkında konuşabilirim. AutoMapper'ı oluşturmak için birkaç hedefim vardı:
Bunları yapmak istiyorsanız, AutoMapper sizin için çok iyi çalışır. AutoMapper'ın iyi yapmadığı şeyler şunlardır:
Sebebi, bu şeyleri yapmak için hiç ihtiyacım olmadı. Çoğunlukla, varlıklarımızın ayarlayıcıları yoktur, koleksiyonları açığa çıkarmazlar, bu yüzden orada değildir. AutoMapper'ı DTO'ları düzleştirmek ve UI modellerinden mesajlar ve benzerlerine eşlemek için kullanırız. Burası bizim için gerçekten iyi çalışıyor.
Her ikisini de denedim ve çok basit olduğu için ValueInjecter'ı tercih ettim:
myObject.InjectFrom(otherObject);
Enjeksiyon ihtiyacımın büyük çoğunluğu için bilmeniz gereken tek şey bu. Bundan daha basit ve zarif olamaz.
this object
orada uzatma yöntemi?
InjectFrom()
uzantı yöntemini kendiniz uygulamaktır.
Bu ben de araştırıyorum ve kullanım durumum için eller aşağı değer gibi görünüyor. Kullanmak için herhangi bir ön kurulum gerektirmez (akıllıca uygulanmışsa, eşlemeleri her seferinde yansıtmak yerine gelecekteki çağrılar için önbelleğe alabilmesine rağmen, sanırım performansa vurabilir), bu nedenle kullanmadan önce herhangi bir eşlemeyi önceden tanımlamanız gerekmez.
Ancak en önemlisi, ters haritalamaya izin verir. Şimdi burada bir şey eksik olabilir çünkü Jimmy gerekli olduğu yerde bir kullanım durumu görmediğinden bahsediyor, bu yüzden belki de desende yanlış var, ama benim kullanım durumum ORM'den bir ViewModel nesnesi oluşturduğum. Daha sonra bunu web sayfamda görüntülüyorum. Kullanıcı bittikten sonra ViewModel'i bir httppost olarak geri alıyorum, bu nasıl orijinal ORM sınıflarına geri dönüştürülür? Kalıbı automapper ile bilmek isterim. ValueInjector ile önemsizdir ve düzensizleşir. Örneğin, yeni bir varlık oluşturma
Varlık çerçevesi tarafından oluşturulan model (önce model):
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 (doğrulayıcılarla süsleyebileceğim):
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();
}
}
Bana göre bundan daha basit değil mi?
(Yani bu soruya yalvarır, ben bu içine koşmak desen ile yanlış olan (ve diğerleri yapmak gibi görünüyor), onun AutoMapper için değer olarak görülmüyor?)
Ancak, bu desen açıklandığı gibi, kullanmak istediğiniz modelse, oyum ülke miline göre değerlidir.