Automapper自动映射

3

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

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; }

问题是:是否可以使用自动映射完成,如果可以,应该如何进行?

你能添加更多细节吗?例如,您希望在每个属性中看到什么内容(例如,在“dictionary”中,“int”代表什么?)。最好包含示例数据的单元测试。 - Mightymuke
整数必须表示枚举中的索引,例如(对于英语,它是1),字符串表示值,在这里它是英语。 - Fabien Piron
1个回答

0

好的,根据您提供的细节,我得出了以下结论。

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"));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接