В следующем примере (LinqPad):
void Main()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, DestinationNested>()
.ConstructUsing((source, context) => new DestinationNested(source.InnerValue));
cfg.CreateMap<Source, DestinationOuter>()
.ForMember(x => x.OuterValue, y => y.MapFrom(z => z.OuterValue))
.ConstructUsing((source, context) =>
{
return new DestinationOuter(source.OuterValue, context.Mapper.Map<DestinationNested>(source));
});
});
var src = new Source { OuterValue = 999, InnerValue = 111 };
var mapper = config.CreateMapper();
var mapped = mapper.Map<DestinationOuter>(src);
mapped.Dump();
mapper.ConfigurationProvider.AssertConfigurationIsValid();
}
public class Source
{
public int OuterValue { get; set; }
public int InnerValue { get; set; }
}
public class DestinationOuter
{
public int OuterValue { get; private set; }
public DestinationNested destinationNested { get; private set; }
public DestinationOuter(int outerValue, DestinationNested destinationNested)
{
this.OuterValue = outerValue;
this.destinationNested = destinationNested;
}
}
public class DestinationNested
{
public int NestedValue { get; private set; }
public DestinationNested(int nestedValue)
{
this.NestedValue = nestedValue;
}
}
В настоящее время AssertConfigurationIsValid () вызывает исключение, касающееся свойств, так как я использую ContructUsing.
На практике это правильно отображает,но я бы хотел, чтобы AssertConfigurationIsValid был частью моего набора тестов для поиска регрессий (без необходимости выполнять ручные тесты маппера).
Я хотел бы подтвердить, что все мои свойства отображаются из источника впункт назначения через конструктор. Я хочу использовать конструктор, так как это мой уровень Домена, и этот конструктор применяет обязательные элементы.
Я не хочу игнорировать все частные сеттеры с помощью функции IgnoreAllPropertiesWithAnInaccessibleSetter (), поскольку я могу игнорировать что-то, что яна самом деле не установлено.
В идеале мне также не нужно выполнять ручную Ignore () для каждого из свойств, которые появляются в конструкторе, поскольку это оставляет пробел для смещения кода.
Я пробовал разные комбинации в Automapper, но пока не повезло.
Полагаю, это проблема статического анализа;Я хотел бы знать, что мой конструктор охватывает все свойства в пункте назначения. И я хотел бы знать, что в конструктор передается все из источника.
Я понимаю, что Automapper пока не работает очень автоматически, есть ли хороший способ использовать autopper для этого тестирования илиЭто вместо статического анализа проблема?