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
'development' 카테고리의 다른 글
Sysinternals의 Portmon : 오류 2 (0) | 2020.12.25 |
---|---|
웹 사이트를 스파이더 링하고 URL 만 반환 (0) | 2020.12.25 |
ggplot 범례에서 선 색상 및 선 유형 제어 (0) | 2020.12.25 |
라이브 Android 오디오를 서버로 스트리밍 (0) | 2020.12.25 |
컨볼 루션 신경망과 반복 신경망의 차이점은 무엇입니까? (0) | 2020.12.25 |