3

次のプロパティをカウントするドメインモデルがあります。

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

ここで、Languageはここで定義された列挙を表します:

public enum Language
{
    English,
    French,
    Spannish
}

ドメインモデル内に保存されている言語値に基づいて、次の2つのプロパティを自動的に入力したいと思います。

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

問題は、オートマッパーを使用して実行できるかどうかです。その場合、どのように進めればよいですか?

4

1 に答える 1

0

OK、あなたが提供した詳細を使用して、これが私が思いついたものです。

クラス

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に名前が変更されたことに注意してくださいSOProfileAutoMapper

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"));
    }
}
于 2012-11-28T21:41:12.077 に答える