【问题标题】:Automapper automatic mappingAutomapper 自动映射
【发布时间】:2012-11-28 09:45:03
【问题描述】:

我有一个包含以下属性的域模型:

public class Profile
{
    public DateTime birthDate { get; set; }
    public List<Language> languages { get; set; }
}

Language 代表此处定义的枚举:

public enum Language
{
    English,
    French,
    Spannish
}

我想根据存储在我的域模型中的语言值自动填充以下两个属性:

public Dictionary <int, String> languages_list { get; set; }
public List<string> languages_known { get; set; }

问题是:是否可以使用 automapper 完成,如果可以,我应该如何进行?

【问题讨论】:

  • 你能补充一些细节吗?即,您希望在每个属性中看到什么(例如,int 在dictionary 中代表什么?)。理想情况下,包含示例数据的单元测试会很棒。
  • int 必须表示枚举中的索引,例如(英语为 1)字符串表示值,这里是英语

标签: automapper dto


【解决方案1】:

好的,使用您提供的详细信息,这就是我想出的。

类

public class SOProfile
{
    public DateTime birthDate { get; set; }
    public List<Language> languages { get; set; }
}

public class WhatAmI
{
    public Dictionary<int, String> languages_list { get; set; }
    public List<string> languages_known { get; set; }
}

请注意,Profile 已重命名为 SOProfile,以避免与 AutoMapper 发生冲突

AutoMapper 配置

public class MyProfile : Profile
{
    public override string ProfileName
    {
        get
        {
            return "MyProfile";
        }
    }

    protected override void Configure()
    {
        Mapper.CreateMap<SOProfile, WhatAmI>()
              .ForMember(dest => dest.languages_list,
                         opt => opt.MapFrom(
                             src => src.languages
                                 .Select((x,i) => new { Item = x, Index = i})
                                 .ToDictionary(x => x.Index,
                                               x => x.Item.ToString())))
              .ForMember(dest => dest.languages_known,
                         opt => opt.MapFrom(
                             src => src.languages
                                 .Select(x => x.ToString()).ToList()));
    }
}

单元测试

[TestFixture]
public class MappingTests
{
    [Test]
    public void AutoMapper_Configuration_IsValid()
    {
        Mapper.Initialize(m => m.AddProfile<MyProfile>());
        Mapper.AssertConfigurationIsValid();
    }

    [Test]
    public void AutoMapper_Mapping_IsValid()
    {
        Mapper.Initialize(m => m.AddProfile<MyProfile>());
        Mapper.AssertConfigurationIsValid();

        var profile = new SOProfile
            {
                birthDate = new DateTime(2012, 01, 01),
                languages = new List<Language>
                    {
                        Language.English,
                        Language.French,
                        Language.English,
                        Language.French
                    }
            };

        var rc = Mapper.Map<SOProfile, WhatAmI>(profile);

        Assert.That(rc, Is.Not.Null);

        Assert.That(rc.languages_known, Is.Not.Null);
        Assert.That(rc.languages_known.Count, Is.EqualTo(4));

        Assert.That(rc.languages_known.Count(x => x == "English"),
                    Is.EqualTo(2));
        Assert.That(rc.languages_known.Count(x => x == "French"),
                    Is.EqualTo(2));
        Assert.That(rc.languages_known.Count(x => x == "Spanish"),
                    Is.EqualTo(0));

        Assert.That(rc.languages_list, Is.Not.Null);
        Assert.That(rc.languages_list.Count, Is.EqualTo(4));

        Assert.That(rc.languages_list.First(x => x.Key == 0).Value,
                    Is.EqualTo("English"));
        Assert.That(rc.languages_list.First(x => x.Key == 1).Value,
                    Is.EqualTo("French"));
        Assert.That(rc.languages_list.First(x => x.Key == 2).Value,
                    Is.EqualTo("English"));
        Assert.That(rc.languages_list.First(x => x.Key == 3).Value,
                    Is.EqualTo("French"));
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 2017-12-23
    • 2015-10-20
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多