7 ответов:
EmitMapper,http://emitmapper.codeplex.com/
ValueInjecter https://github.com/omuleanu/ValueInjecter
BLToolkit https://github.com/igor-tkachev/bltoolkit
и моя домашняя разработка OoMapper https://github.com/hazzik/OoMapper
недавно я прошел через аналогичный процесс, пытаясь найти картограф, который действительно охватывает все мои сценарии. Я нашел ValueInjecter лучшим из automapper, emitmapper и нескольких других на codeplex.
Я выбираю ValueInjector, потому что это самый гибкий из них всех. У меня было требование к отображению из сущности в viewmodel, а viewmodel обратно в сущность, глубокое клонирование, где у вас есть клиент - > проекты - > проект, рекурсивные ситуации, такие как customer project, и добавить/обновить / удалить дочерние коллекции.
из коробки ValueInjector не поддерживает это, но его структура достаточно расширяема, чтобы легко поддерживать это. Вы можете увидеть мою точку расширения в этой конвенции, которую я разместил на своем дискуссионном форуме...
есть много альтернатив, таких как:
но также вы можете использовать Expressmapper. Он прост и основан на деревьях выражений, которые работают как рукописный код, и любые сопоставления являются высокая оптимизация по всему решению. Также вы можете взглянуть на факты - критерии что доказать Expressmapper это то же самое, что и рукописный код. Он обладает почти такой же кучей функций, что и AutoMapper, другие будут поддерживаться в будущих версиях. И он чрезвычайно прост в использовании.
старый вопрос, но взгляните на Mapster. Это намного быстрее, чем AutoMapper (5-10X в сценариях, в которых я его использовал), если производительность критична и поддерживает большинство сценариев AutoMapper. Всегда помните, чтобы perf тест, как результаты зависят от сценария.
Мы сбросили новую тройку.X версии, которая работает на .Net версии 4.0/4.5/ядра, поддерживает несколько новых функций, и большой производительности улучшения.http://www.nuget.org/packages/Mapster/
https://github.com/eswann/Mapster
Disclosure...it это один из моих проектов, который был создан для службы с высокой нагрузкой, где AutoMapper начал появляться как одно из наших узких мест.
Если вы предпочитаете "свернуть свой собственный" ... Вот быстрая N грязная альтернатива AutoMapper (немного легче отлаживать проблемы + 1 меньше зависимости от проекта)
public static List<TResult> QuickMapper<TSource, TResult>(IList<TSource> data) where TResult : new() { /* N.B. no DEEP copy - good for simple dto to View Model transfer etc ... classes will need to have a parameterless constructor 'where TResult : new()' by default - this will ignore cases where destination object does not have one of the source object's fields- common in ViewModels ... you could use a Dictionary<String,string> param to handle cases where property names don't marry up.. to use : List<Class2> lst2 = Helper.QuickMapper<Class1, Class2>(lst1).ToList(); */ var result = new List<TResult>(data.Count); PropertyDescriptorCollection propsSource = TypeDescriptor.GetProperties(typeof(TSource)); PropertyDescriptorCollection propsResult= TypeDescriptor.GetProperties(typeof(TResult)); TResult obj; Object colVal; string sResultFieldName = ""; string sSourceFieldName = ""; foreach (TSource item in data) { obj = new TResult(); for (int iResult = 0; iResult < propsResult.Count; iResult++) { PropertyDescriptor propResult = propsResult[iResult]; sResultFieldName = propResult.Name ; for (int iSource = 0; iSource < propsResult.Count; iSource++) { PropertyDescriptor propSource = propsSource [iSource ]; sSourceFieldName = propSource.Name; if (sResultFieldName == sSourceFieldName) { try { colVal = propSource.GetValue(item) ?? null; propResult.SetValue(obj, colVal); } catch (Exception ex) { string ss = "sResultFieldName = " + sResultFieldName + "\r\nsSourceFieldName = " + sSourceFieldName + "\r\n" + ex.Message + "\r\n" + ex.StackTrace; // do what you want here ... } } } } result.Add(obj); } return result; }
Это старый вопрос, но теперь также https://github.com/agileobjects/AgileMapper
почему бы не использовать такие инструменты, даже если вам просто нужно 10% от его функциональности. Эти инструменты обычно хорошо протестированы и с практикой нам нравится использовать их все больше и больше, а затем мы начинаем использовать их другие причудливые возможности. Обновление продукта всегда рискованно, но именно для этого существуют модульные тесты.
Кроме того, я обнаружил новый картограф, который кажется многообещающим : Hmapper. Мне особенно нравится его производительность, его способность выбирать, какие подобъекты должны быть получены во время картирования, и его строго типизированный способ отображения открытых универсальных типов. Этот маппер работает хорошо до сих пор, по крайней мере в моем текущем проекте. Посмотрите здесь :http://www.codeproject.com/Tips/1152752/H-Mapper
например, мы можем указать подобъекты с помощью Linq:
Mapper.Map<Class1, Class2>(source, x=>x.Subobject)таким образом, нам не нужно создавать класс DTO для подробной информации и другой для листинга (легкий вес).
Я нахожу это очень аккуратно.
Comments