我已经定义了一个到/来自我的DTO对象的映射,除了DTO对象具有定义为ISet的集合和非DTO对象具有定义为HashSet的集合之外,其他属性与另一个匹配。我注意到DTO的显着性能命中映射 - >非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>();
答案 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>();