Skip to content

Commit 68a7ea7

Browse files
author
Rafał Kukla
committed
Reversing execution order of Before/AfterMapping
1 parent cc81763 commit 68a7ea7

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

src/Mapster.Tests/WhenPerformingAfterMapping.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ public void TestCleanup()
1616
[TestMethod]
1717
public void After_Mapping()
1818
{
19+
TypeAdapterConfig<SimplePocoBaseBase, SimpleDto>.NewConfig()
20+
.AfterMapping((src, dest) => dest.Name += "!!!");
21+
TypeAdapterConfig<SimplePocoBase, SimpleDto>.NewConfig()
22+
.AfterMapping((src, dest) => dest.Name += "***");
1923
TypeAdapterConfig<SimplePoco, SimpleDto>.NewConfig()
2024
.AfterMapping((src, dest) => dest.Name += "xxx");
2125

@@ -27,7 +31,7 @@ public void After_Mapping()
2731
var result = TypeAdapter.Adapt<SimpleDto>(poco);
2832

2933
result.Id.ShouldBe(poco.Id);
30-
result.Name.ShouldBe(poco.Name + "xxx");
34+
result.Name.ShouldBe(poco.Name + "!!!***xxx");
3135
}
3236

3337
[TestMethod]
@@ -95,11 +99,18 @@ public interface IValidatable
9599
void Validate();
96100
}
97101

98-
public class SimplePoco
102+
public class SimplePocoBaseBase
99103
{
100-
public Guid Id { get; set; }
101104
public string Name { get; set; }
102105
}
106+
public class SimplePocoBase : SimplePocoBaseBase
107+
{
108+
}
109+
110+
public class SimplePoco : SimplePocoBase
111+
{
112+
public Guid Id { get; set; }
113+
}
103114

104115
public class SimpleDto : IValidatable
105116
{

src/Mapster.Tests/WhenPerformingBeforeMapping.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,25 @@ public void TestCleanup()
1414
TypeAdapterConfig.GlobalSettings.Clear();
1515
}
1616

17+
[TestMethod]
18+
public void MapToType_Support_CorrectInheritanceOrder()
19+
{
20+
TypeAdapterConfig<SimplePocoBase, SimpleDto>.NewConfig()
21+
.BeforeMapping((src, result) => result.Type = $"{src.Name}!!!");
22+
TypeAdapterConfig<SimplePoco, SimpleDto>.NewConfig()
23+
.BeforeMapping((src, result) => result.Type += "xxx");
24+
25+
var poco = new SimplePoco
26+
{
27+
Id = Guid.NewGuid(),
28+
Name = "test",
29+
};
30+
var result = TypeAdapter.Adapt<SimpleDto>(poco);
31+
result.Id.ShouldBe(poco.Id);
32+
result.Name.ShouldBe(poco.Name);
33+
result.Type.ShouldBe($"{poco.Name}!!!xxx");
34+
}
35+
1736
[TestMethod]
1837
public void MapToType_Support_Destination_Parameter()
1938
{
@@ -25,7 +44,7 @@ public void MapToType_Support_Destination_Parameter()
2544
Id = Guid.NewGuid(),
2645
Name = "test",
2746
};
28-
47+
2948
// check expression is successfully compiled
3049
Assert.ThrowsException<NullReferenceException>(() => poco.Adapt<SimpleDto>());
3150
}
@@ -55,16 +74,21 @@ public void MapToTarget_Support_Destination_Parameter()
5574
result.ShouldBe(new List<int> { 0, 1, 2, 3, });
5675
}
5776

58-
public class SimplePoco
77+
public class SimplePocoBase
5978
{
60-
public Guid Id { get; set; }
6179
public string Name { get; set; }
6280
}
6381

82+
public class SimplePoco : SimplePocoBase
83+
{
84+
public Guid Id { get; set; }
85+
}
86+
6487
public class SimpleDto
6588
{
6689
public Guid Id { get; set; }
6790
public string Name { get; set; }
91+
public string Type { get; set; }
6892
}
6993
}
7094
}

src/Mapster/Adapters/BaseAdapter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,15 +238,15 @@ protected Expression CreateBlockExpressionBody(Expression source, Expression? de
238238
assignActions.Add(assign);
239239

240240
//before(source, result, destination);
241-
var beforeMappings = arg.Settings.BeforeMappingFactories.Select(it => InvokeMapping(it, source, result, destination, arg, true));
241+
var beforeMappings = arg.Settings.BeforeMappingFactories.Select(it => InvokeMapping(it, source, result, destination, arg, true)).Reverse();
242242
assignActions.AddRange(beforeMappings);
243243

244244
//result.prop = adapt(source.prop);
245245
var mapping = CreateBlockExpression(transformedSource, result, arg);
246246
var settingActions = new List<Expression> {mapping};
247247

248248
//after(source, result, destination);
249-
var afterMappings = arg.Settings.AfterMappingFactories.Select(it => InvokeMapping(it, source, result, destination, arg, false));
249+
var afterMappings = arg.Settings.AfterMappingFactories.Select(it => InvokeMapping(it, source, result, destination, arg, false)).Reverse();
250250
settingActions.AddRange(afterMappings);
251251

252252
//return result;

0 commit comments

Comments
 (0)