Каждый раз, когда я ищу материал AutoMapper в StackOverflow, я читаю что-то о ValueInjecter.
Может ли кто-нибудь сказать мне плюсы и минусы между ними (производительность, функции, использование API, расширяемость, тестирование)?
Каждый раз, когда я ищу материал AutoMapper в StackOverflow, я читаю что-то о ValueInjecter.
Может ли кто-нибудь сказать мне плюсы и минусы между ними (производительность, функции, использование API, расширяемость, тестирование)?
как создатель ValueInjecter, я могу сказать вам, что я сделал это, потому что мне нужно было что-то простое и очень гибкий
Я действительно не люблю много писать или писать много monkey code
вроде:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter - это что-то вроде Mozilla с ее плагинами, вы создаете ValueInjection и используете их.
есть встроенные инъекции для сглаживания, сглаживания, а некоторые предназначены для наследования
и он работает больше в аспекте типа, вам не нужно указывать все свойства один к одному, вместо этого вы делаете что-то вроде:
взять все свойства int из источника, имя которого заканчивается на «Id», преобразовать значение и установить каждое свойство в исходном объекте с тем же именем без суффикса Id, и его тип наследуется от Entity, и тому подобное < / em>
одно очевидное отличие: ValueInjecter используется даже в формах окна со сглаживанием и сглаживанием, вот насколько он гибкий
(отображение от объекта к элементам управления формы и обратно)
Automapper, не может использоваться в формах Windows, без unflatenning, но у него есть хорошие вещи, такие как сопоставление коллекций, поэтому, если вам это нужно с ValueInjecter, вы просто делаете что-то вроде:
foos.Select(o => new Bar().InjectFrom(o));
вы также можете использовать ValueInjecter для сопоставления из анонимных и динамических объектов
различия:
automapper создает конфигурацию для каждой возможности сопоставления CreateMap ()
valueinjecter вводить из любого объекта в любой объект (также бывают случаи, когда вы вводите из объекта в тип значения)
автомаппер имеет встроенное уплощение, и только для простых типов или из одного и того же типа, и в нем нет выравнивания
valueinjecter, только если он вам нужен, вы делаете target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
, а если хотите от Foo.Bar.Name of type String
до FooBarName of type Class1
, вы наследуете FlatLoopValueInjection и указываете это
automapper отображает свойства с одинаковыми именами по умолчанию, а для остальных вы должны указывать одно за другим и делать такие вещи, как Prop1.Ignore (), Prop2.Ignore () и т. д.
valueinjecter имеет инъекцию по умолчанию .InjectFrom (), которая выполняет свойства с тем же именем и типом; для всего остального вы создаете свои собственные инъекции значений с индивидуальной логикой / правилами сопоставления, больше похожими на аспекты, например от всех свойств типа Foo до всех свойств типа Bar
<pedant>
Выглядит круто, но, может быть, это должен быть ValueInjectOr? </pedant>
- person Craig Stuntz; 01.03.2011
Поскольку я никогда не использовал другие инструменты, я могу говорить только об AutoMapper. При создании AutoMapper у меня было несколько целей:
Если вы хотите делать это, AutoMapper отлично подойдет вам. AutoMapper не справляется с такими задачами:
Причина в том, что мне никогда не нужно было этого делать. По большей части у наших сущностей нет сеттеров, не выставляют коллекции и т. Д., Поэтому его там нет. Мы используем AutoMapper для сглаживания в DTO и отображения моделей пользовательского интерфейса на командные сообщения и тому подобное. Вот где это действительно хорошо работает для нас.
Я пробовал оба и предпочитаю ValueInjecter, потому что это очень просто:
myObject.InjectFrom(otherObject);
Это все, что мне нужно знать о подавляющем большинстве моих инъекций. Нет ничего более простого и элегантного, чем это.
this object
есть метод расширения?
- person Chris Marisic; 13.01.2011
InjectFrom()
.
- person jgauffin; 23.03.2011
Это вопрос, который я тоже исследовал, и для моего случая использования он, кажется, бесполезен. Он не требует предварительной настройки для использования (я думаю, это может снизить производительность, хотя при грамотной реализации он может кэшировать сопоставления для будущих вызовов, а не отражать каждый раз), поэтому вам не нужно заранее определять какие-либо сопоставления перед их использованием.
Однако, что наиболее важно, это позволяет обратное отображение. Теперь мне может чего-то не хватать, поскольку Джимми упоминает, что он не видит варианта использования там, где это необходимо, поэтому, возможно, у меня неправильный шаблон, но мой вариант использования заключается в том, что я создаю объект ViewModel из моего ORM. Затем я показываю это на своей веб-странице. После того, как пользователь закончит, я верну ViewModel в виде httppost, как это преобразовать обратно в исходные классы ORM? Я хотел бы узнать шаблон с автомаппером. С ValueInjector это тривиально, и даже неплохо. например, создание нового объекта
Модель, созданная entityframework (сначала модель):
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 (которую я могу украсить валидаторами):
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();
}
}
На мой взгляд, нет ничего проще?
(Итак, возникает вопрос, что не так с шаблоном, с которым я столкнулся (и, похоже, многие другие так поступают), что он не рассматривается как ценность для AutoMapper?)
Однако, если вы хотите использовать этот шаблон, описанный в описании, то мой голос будет полезен для каждой страны.