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



我已经定义了与我的DTO对象的映射,一个与另一个的属性完全匹配,除了DTO对象的集合定义为ISet,非DTO对象的集合定义为HashSet。 我注意到 DTO -> 非 DTO 与相反的方式相比,性能命中映射显着。

AutoMapper 似乎无法从具体类的接口中获取,我想知道我是否在映射中缺少某些内容,或者在某处进行更明确的配置。 这种范式存在于我们的代码库中,但对于我所讨论的对象,我可以在大约 8 秒内从 DTO 映射 2k 个对象,并且可以在大约 .1 秒内将完全相同的对象映射到 DTO

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>();
我们发现在我们的

例子中,升级Automapper(到版本6.0.2(将是要走的路。 使用更新的自动映射器以及上面列出的相同对象和映射,我们看到 ExampleDTO->Example 对象在 1.57 秒内映射,相反的情况在 1.86 秒内映射。 我不太乐意发布一个说使用升级的答案,所以我会发布一些选项,这些选项带来了一些适度的收益,如果其他人有实际答案,我很乐意标记那个答案。

我尝试为 ISet HashSet 创建映射,这大约是没有指定映射的两倍,我不记得我在这里做了什么,但我在谷歌上找到了它。

我尝试的另一个选项是在DTO对象上创建非可映射哈希集,该对象仅返回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>();

相关内容

  • 没有找到相关文章

最新更新