development

AutoMapper의 대안

big-blog 2020. 12. 25. 22:43
반응형

AutoMapper의 대안


AutoMapper를 제외하고 .NET에서 개체 대 개체 매핑에 사용할 수있는 다른 대체 프레임 워크는 무엇입니까?

현재 AutoMapper를 사용할 계획이지만이 프레임 워크를 마무리하기 전에 다른 프레임 워크가 있는지 이해하고 싶습니다.


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는 가장 유연하기 때문에 선택합니다. 엔터티에서 뷰 모델로 매핑하고 뷰 모델을 엔터티로 다시 매핑해야하고, 고객-> 프로젝트-> 프로젝트, 고객 <-> 프로젝트와 같은 재귀 적 상황, 하위 컬렉션 추가 / 업데이트 / 삭제가있는 딥 클로닝이 필요했습니다.

Out of the Box ValueInjector는이를 지원하지 않지만 프레임 워크는이를 쉽게 지원할 수있을만큼 충분히 확장 가능합니다. 토론 포럼에 게시 한이 대회에서 내 확장 지점을 볼 수 있습니다.

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


오래된 질문이지만 Mapster를 살펴보십시오. 성능이 중요하고 대부분의 AutoMapper 시나리오를 지원하는 경우 AutoMapper (내가 사용한 시나리오에서 5-10X)보다 훨씬 빠릅니다. 결과는 시나리오에 따라 다르므로 항상 성능 테스트를 기억하십시오.
.Net 4.0 / 4.5 / Core에서 작동하고 몇 가지 새로운 기능을 지원하며 성능이 크게 개선 된 새로운 3.x 버전을 삭제했습니다.

http://www.nuget.org/packages/Mapster/

https://github.com/eswann/Mapster

공개 ... AutoMapper가 병목 현상 중 하나로 나타나기 시작한 고부하 서비스를 위해 만들어진 프로젝트 중 하나입니다.


이것은 오래된 질문이지만 이제 https://github.com/agileobjects/AgileMapper있습니다.


"자신 만의 롤링"을 선호하는 경우 ... AutoMapper에 대한 Quick n dirty 대안이 있습니다 (문제를 디버그하기 쉬운 비트 + 프로젝트 종속성 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;
    }

기능의 10 % 만 필요하더라도 이러한 도구를 사용하지 않는 이유는 무엇입니까? 이러한 도구는 일반적으로 잘 테스트되고 연습을 통해 점점 더 많이 사용하는 것을 좋아하며 다른 멋진 가능성을 사용하기 시작합니다. 제품 업그레이드는 항상 위험하지만 이것이 단위 테스트의 목적입니다.
또한 유망 해 보이는 새로운 매퍼 인 Hmapper 를 발견했습니다 . 특히 성능, 매핑 중에 검색해야하는 하위 개체를 선택하는 기능, 개방형 제네릭 형식을 매핑하는 강력한 형식의 방법이 마음에 듭니다. 이 매퍼는 적어도 현재 프로젝트에서는 잘 작동합니다. 여기를보세요 :

http://www.codeproject.com/Tips/1152752/H-Mapper

For example, we can specify sub objects using Linq:

Mapper.Map<Class1, Class2>(source, x=>x.Subobject)

This way, we don't have to create a DTO class for detailed information and another one for listing (light weight).

I find this very neat.

ReferenceURL : https://stackoverflow.com/questions/7052002/alternatives-to-automapper

반응형