[英]Map a hierarchy object with AutoMapper
如何映射名為 Unit 的 ac# 類,該類再次具有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; }
}
將上面的單元映射到這個視圖模型:
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; }
}
假設我在上面評論中的問題的答案是肯定的,那么您需要多次應用映射 - 類似於這個問題: 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"));
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.