Каждый раз, когда я ищу материал 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 и используете их
Есть встроенные инъекции для выравнивания, разглаживания и некоторые, которые предназначены для наследования
и это больше работает в аспектном виде , вам не нужно указывать все свойства 1-к-1, вместо этого вы делаете что-то вроде:
взять все свойства int из источника, имя которых заканчивается на «Id», преобразовать значение и установить каждое свойство в исходном объекте с тем же именем без суффикса Id, а его тип наследуется от Entity, и тому подобное
Итак, одно очевидное отличие: ValueInjecter используется даже в формах окон с выравниванием и разглаживанием.
(отображение от объекта до формы управления и обратно)
Automapper, не пригодный для использования в формах Windows, без лишних слов, но имеет хорошие вещи, такие как отображение коллекций, поэтому в случае, если вам это нужно с ValueInjecter, вы просто делаете что-то вроде:
foos.Select(o => new Bar().InjectFrom(o));
Вы также можете использовать ValueInjecter для сопоставления с анонимными и динамическими объектами
различия:
автоматическое создание конфигурации для каждой возможности отображения CreateMap ()
valueinjecter внедрить из любого объекта в любой объект (бывают случаи, когда вы вводите из объекта в тип оценки)
В автопреобразователе построено выравнивание, и только для простых типов или из того же типа, и оно не имеет разглаживания
valueinjecter только если вам это нужно вы делаете , target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
и если вы хотите от Foo.Bar.Name of type String
к FooBarName of type Class1
вам наследовать FlatLoopValueInjection и указать это
По умолчанию AutoMaker отображает свойства с одинаковыми именами, а в остальном вы должны указывать одно за другим и делать такие вещи, как Prop1.Ignore (), Prop2.Ignore () и т. д.
valueinjecter имеет инъекцию по умолчанию .InjectFrom (), которая делает свойства с тем же именем и типом; для всего остального вы создаете свои собственные значения-инъекции с индивидуальной логикой / правилами отображения, более похожими на аспекты, например, от всех реквизитов типа Foo до всех реквизитов типа Bar
<pedant>
Выглядит круто, но, возможно, это должен быть ValueInjectOr? </pedant>
Поскольку я никогда не использовал другие инструменты, я могу говорить только об AutoMapper. У меня было несколько целей для создания AutoMapper:
Если вы хотите сделать это, AutoMapper работает очень хорошо для вас. AutoMapper не очень хорошо работает:
Причина в том, что мне никогда не нужно было делать эти вещи. По большей части, наши сущности не имеют сеттеров, не выставляют коллекции и т. Д., Поэтому его там нет. Мы используем AutoMapper для выравнивания DTO и отображения моделей UI для командных сообщений и тому подобного. Вот где это работает очень хорошо для нас.
Я попробовал оба и предпочел ValueInjecter, потому что это так просто:
myObject.InjectFrom(otherObject);
Это все, что нужно знать для подавляющего большинства моих потребностей в инъекциях. Это не может быть более простым и элегантным, чем это.
this object
метод расширения есть?
InjectFrom()
метод расширения самостоятельно.
Это вопрос, который я тоже изучал, и для моего случая использования он кажется полезным. Он не требует предварительной настройки для использования (я думаю, это может повлиять на производительность, хотя при умном внедрении он может кэшировать сопоставления для будущих вызовов, а не каждый раз отражать их), поэтому вам не нужно предварительно задавать какие-либо сопоставления перед их использованием.
Однако самое главное, что это позволяет обратное отображение. Теперь я могу что-то здесь упустить, так как Джимми упоминает, что он не видит ни одного варианта использования, где это необходимо, поэтому, возможно, у меня неправильный шаблон, но мой вариант использования заключается в том, что я создаю объект ViewModel из своего ORM. Затем я отображаю это на своей веб-странице. Как только пользователь заканчивает, я возвращаю ViewModel как httppost, как это преобразуется обратно в исходные классы ORM? Я хотел бы знать шаблон с автопромышленности. С ValueInjector это тривиально, и это будет даже разглаживаться. например, создание нового объекта
Модель, созданная структурой объекта (сначала модель):
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?)
Однако, если вы хотите использовать этот шаблон, как описано выше, то мой голос оценивается в миле от страны.