除了AutoMapper
之外,.NET中的对象到对象映射有哪些不同的替代框架目前我们计划使用AutoMapper,但在最终确定此框架之前,我们希望了解其他任何框架。
答案 0 :(得分:36)
EmitMapper,http://emitmapper.codeplex.com/
ValueInjecter https://github.com/omuleanu/ValueInjecter
BLToolkit https://github.com/igor-tkachev/bltoolkit
我的家庭作业开发OoMapper https://github.com/hazzik/OoMapper
答案 1 :(得分:18)
我最近经历了一个类似的过程,试图找到一个真正涵盖我所有场景的映射器。我发现ValueInjecter是最好的自动化器,emitmapper和其他一些在codeplex上。
我选择了ValueInjector,因为它是最灵活的。我有一个要求从实体映射到viewmodel,viewmodel回到实体,深度克隆你有客户 - >项目 - >项目,客户等的递归情况< - >项目,以及添加/更新/删除子集合。
开箱即用的ValueInjector不支持这一点,但它的框架可扩展到足以支持这一点。您可以在我在论坛上发布的这个约定中看到我的扩展点...
答案 2 :(得分:16)
有许多替代方案,如:
但您也可以使用Expressmapper。它很简单,它基于表达式树,可以作为手写代码使用,并且任何映射都可以在整个解决方案中进行高度优化。您还可以查看事实 - benchmarks,证明Expressmapper与手写代码相同。它拥有与AutoMapper几乎完全相同的功能,其他版本将在未来的版本中得到支持。它非常易于使用。
答案 3 :(得分:13)
老问题,但看看Mapster。如果性能至关重要且支持大多数AutoMapper场景,它比AutoMapper(在我使用它的场景中为5-10倍)要快得多。始终记得进行性能测试,因为结果因场景而异 我们删除了适用于.Net 4.0 / 4.5 / Core的新3.x版本,支持多项新功能,并且具有很大的性能改进。
http://www.nuget.org/packages/Mapster/
https://github.com/eswann/Mapster
披露......这是我为高负荷服务创建的一个项目,其中AutoMapper开始显示为我们的瓶颈之一。
答案 4 :(得分:3)
这是一个老问题,但现在还有https://github.com/agileobjects/AgileMapper
答案 5 :(得分:2)
如果您愿意自己推动自己的" ... 这是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;
}
答案 6 :(得分:0)
即使您只需要10%的功能,为什么不使用这些工具。这些工具通常经过充分测试,通过实践,我们希望越来越多地使用它们,然后我们开始使用它们的其他花哨的可能性。升级产品总是有风险的,但这就是单元测试的目的 此外,我发现了一个看似很有希望的新映射器: Hmapper 。 我特别喜欢它的性能,它能够选择在映射期间必须检索哪些子对象,以及它的强类型映射开放泛型类型的方式。 到目前为止,这个映射器运行良好,至少在我当前的项目中。 看看这里:
http://www.codeproject.com/Tips/1152752/H-Mapper
例如,我们可以使用Linq指定子对象:
Mapper.Map<Class1, Class2>(source, x=>x.Subobject)
这样,我们不必创建DTO类来获取详细信息,另一个用于列出(轻量级)。
我觉得这很整洁。