使用AutoMapper映射层次结构对象

时间:2012-11-25 22:15:10

标签: c# automapper

如何映射名为Unit的c#类,该类又有List<Unit>

具体方案是一个rootUnit对象,它包含一个作为第一级子级的List。

第一级子单元对象不包含任何其他单元,因此层次结构中不会有递归。

public class Unit
    {
        public Unit()
        {
            // Explicitly set the default value for the first unit in a hierarchy
            HierarchyIndex = 0;
            Units = new List<Unit>();
        }

        public List<Unit> Units { get; set; }

        public int UnitId { get; set; }
        public string Name { get; set; }       
        public Nullable<int> ParentId { get; set; }
        public int TemplateId { get; set; }       
        public bool HasChildren { get; set; }
        public bool IsFolder { get; set; }
        public DateTime CreatedAt { get; set; }
        public int HierarchyIndex { get; set; }
    }

将上面的单位映射到此viewmodel:

public class UnitTreeViewModel
{
    [JsonProperty("key")]
    public int UnitId { get; set; }
    [JsonProperty("title")]
    public string Name { get; set; }
    [JsonProperty("isLazy")]
    public bool HasChildren { get; set; } 
    [JsonProperty("isFolder")]
    public bool IsFolder { get; set; } 
}

1 个答案:

答案 0 :(得分:2)

假设上面评论中我的问题的答案是肯定的,那么您需要多次应用映射 - 类似于这个问题:AutoMapper and flattening nested arrays

这样的事可能有用:

<强> AutoMapperConfigurator.cs

namespace StackOverflow.ListUnit
{
    using AutoMapper;

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

        protected override void Configure()
        {
            Mapper.CreateMap<Unit, UnitTreeViewModel>();
        }
    }
}

<强> MappingTests.cs

namespace StackOverflow.ListUnit
{
    using System.Collections.Generic;
    using System.Linq;

    using AutoMapper;

    using NUnit.Framework;

    [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 unit = new Unit
                {
                    UnitId = 123,
                    Name = "Stack Overflow Rocks",
                    HasChildren = true,
                    IsFolder = true,
                    Units =
                        new List<Unit>
                            {
                                new Unit
                                    {
                                        UnitId = 123123,
                                        Name = "I'm the first baby",
                                        HasChildren = false,
                                        IsFolder = false,
                                    },
                                new Unit
                                    {
                                        UnitId = 123321,
                                        Name = "I'm the second baby",
                                        HasChildren = false,
                                        IsFolder = false,
                                    }
                            }
                };

            var unitViewModels = new List<UnitTreeViewModel>
                {
                    Mapper.Map<Unit, UnitTreeViewModel>(unit)
                };
            unitViewModels.AddRange(
                unit.Units.Select(Mapper.Map<Unit, UnitTreeViewModel>));

            Assert.That(unitViewModels, Is.Not.Null);
            Assert.That(unitViewModels.Count(), Is.EqualTo(3));
            var unitViewModel = unitViewModels.First(x => x.UnitId == 123);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("Stack Overflow Rocks"));
            unitViewModel = unitViewModels.First(x => x.UnitId == 123123);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("I'm the first baby"));
            unitViewModel = unitViewModels.First(x => x.UnitId == 123321);
            Assert.That(unitViewModel, Is.Not.Null);
            Assert.That(unitViewModel.Name, Is.EqualTo("I'm the second baby"));
        }
    }
}