AutoMapper的替代品

时间:2011-08-13 17:06:28

标签: .net automapper

除了AutoMapper

之外,.NET中的对象到对象映射有哪些不同的替代框架

目前我们计划使用AutoMapper,但在最终确定此框架之前,我们希望了解其他任何框架。

7 个答案:

答案 0 :(得分:36)

答案 1 :(得分:18)

我最近经历了一个类似的过程,试图找到一个真正涵盖我所有场景的映射器。我发现ValueInjecter是最好的自动化器,emitmapper和其他一些在codeplex上。

我选择了ValueInjector,因为它是最灵活的。我有一个要求从实体映射到viewmodel,viewmodel回到实体,深度克隆你有客户 - >项目 - >项目,客户等的递归情况< - >项目,以及添加/更新/删除子集合。

开箱即用的ValueInjector不支持这一点,但它的框架可扩展到足以支持这一点。您可以在我在论坛上发布的这个约定中看到我的扩展点...

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

答案 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类来获取详细信息,另一个用于列出(轻量级)。

我觉得这很整洁。