Причина, по которой FormCollectionValueResolver<Customer>
никогда не вызывается, заключается в том, что метод ForAllMembers()
выполняет итерацию по всем вашим сопоставлениям свойств, как определено методом ForMember()
, применяя указанные параметры элемента. Однако в предоставленном вами примере кода сопоставления свойств не определены, поэтому преобразователь никогда не вызывается.
Вот пример того, как можно использовать метод ForAllMembers()
.
[Test]
public void AutoMapperForAllMembersTest()
{
Mapper.CreateMap<Source, Destination>()
.ForMember(dest => dest.Sum,
opt => opt.ResolveUsing<AdditionResolver>())
.ForMember(dest => dest.Difference,
opt => opt.ResolveUsing<SubtractionResolver>())
.ForAllMembers(opt => opt.AddFormatter<CustomerFormatter>());
Source source = new Source();
source.Expression = new Expression
{
LeftHandSide = 2,
RightHandSide = 1
};
Destination destination = Mapper.Map<Source, Destination>(source);
Assert.That(destination.Sum, Is.EqualTo("*3*"));
Assert.That(destination.Difference, Is.EqualTo("*1*"));
}
public class Expression
{
public int LeftHandSide { get; set; }
public int RightHandSide { get; set; }
}
public class Source
{
public Expression Expression { get; set; }
}
public class Destination
{
public string Sum { get; set; }
public string Difference { get; set; }
}
public class AdditionResolver : ValueResolver<Source, int>
{
protected override int ResolveCore(Source source)
{
Expression expression = source.Expression;
return expression.LeftHandSide + expression.RightHandSide;
}
}
public class SubtractionResolver : ValueResolver<Source, int>
{
protected override int ResolveCore(Source source)
{
Expression expression = source.Expression;
return expression.LeftHandSide - expression.RightHandSide;
}
}
public class CustomerFormatter : IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
return string.Format("*{0}*", context.SourceValue);
}
}