Альтернативы AutoMapper [закрыто]



каковы различные альтернативные фреймворки, доступные для сопоставления объектов в .NET, кроме AutoMapper



В настоящее время мы планируем использовать AutoMapper, но прежде чем завершить эту структуру, мы хотим понять, что любые другие фреймворки существуют.

681   7  

7 ответов:

недавно я прошел через аналогичный процесс, пытаясь найти картограф, который действительно охватывает все мои сценарии. Я нашел ValueInjecter лучшим из automapper, emitmapper и нескольких других на codeplex.

Я выбираю ValueInjector, потому что это самый гибкий из них всех. У меня было требование к отображению из сущности в viewmodel, а viewmodel обратно в сущность, глубокое клонирование, где у вас есть клиент - > проекты - > проект, рекурсивные ситуации, такие как customer project, и добавить/обновить / удалить дочерние коллекции.

из коробки ValueInjector не поддерживает это, но его структура достаточно расширяема, чтобы легко поддерживать это. Вы можете увидеть мою точку расширения в этой конвенции, которую я разместил на своем дискуссионном форуме...

http://valueinjecter.codeplex.com/discussions/274484

есть много альтернатив, таких как:

но также вы можете использовать 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

    Ничего не найдено.