AutoMapper:类属性,将ISet <object>映射到HashSet <object>

时间:2017-04-13 15:33:11

标签: c# automapper-3 automapper-6

我已经定义了一个到/来自我的DTO对象的映射,除了DTO对象具有定义为ISet的集合和非DTO对象具有定义为HashSet的集合之外,其他属性与另一个匹配。我注意到DTO的显着性能命中映射 - &gt;非DTO,与其他方式相比。

AutoMapper似乎在从具体类的接口上遇到麻烦,我想知道我是否在映射中丢失了某些内容,或者在某个地方配置更明确。这个范例存在于我们的代码库中,但对于我的问题,我可以在大约8秒内映射来自DTO的2k对象,并且我可以将完全相同的对象映射到 DTO约为0.1秒

class ExampleDTO
{
    public int Id;
    public enum Type;
    public DateTime creationTime;
    public ISet<string> StringThings;
    public ISet<int> IntThings;
    public ISet<double> DoubleThings;
}
class Example
{
    public int Id;
    public enum Type;
    public DateTime creationTime;
    public HashSet<string> StringThings;
    public HashSet<int> IntThings;
    public HashSet<double> DoubleThings;
}

映射:

CreateMap<ExampleDTO, Example>();
CreateMap<Example, ExampleDTO>();

1 个答案:

答案 0 :(得分:0)

我们发现升级Automapper(到版本6.0.2)将成为我们的理由。使用更新的AutoMapper以及上面列出的相同对象和映射,我们看到ExampleDTO-&gt;示例对象在1.57秒内映射,反向情况在1.86秒内映射。我发布一个说使用升级的答案并不是很高兴,因此我会发布一些可以获得适度收益的选项,如果有其他人有实际答案,我很乐意标记这一点。

我尝试为ISet HashSet创建一个映射,这个速度大约是没有指定映射的两倍,我不记得完全我在这里做了什么,但是我在google上找到了它。 / p>

我尝试的另一个选项是在DTO对象上创建不可映射的HashSet,它只返回ISet。这大约快了3倍,但仍然没有接近升级所获得的性能。

class ExampleDTO
{
    public int Id;
    public enum Type;
    public DateTime creationTime;
    public ISet<string> StringThings;
    [IgnoreMap]
    public HashSet<string> StringThingsHash
    {
        get
        {
            return StringThings;
        }
    }
    public ISet<int> IntThings;
    [IgnoreMap]
    public HashSet<int> IntThingsHash
    {
        get
        {
            return IntThings;
        }
    }
    public ISet<double> DoubleThings;
    [IgnoreMap]
    public HashSet<double> DoubleThingsHash
    {
        get
        {
            return DoubleThings;
        }
    }

我使用了以下映射

CreateMap<ExampleDTO, Example>()
  .ForMember(dest => dest.StringThings, opts => opts.MapFrom(src => src.StringThingsHash)
  .ForMember(dest => dest.IntThings, opts => opts.MapFrom(src => src.IntThingsHash)
  .ForMember(dest => dest.DoubleThings, opts => opts.MapFrom(src => src.DoubleThingsHash);
CreateMap<Example, ExampleDTO>();