У меня есть следующая структура класса:
class SrcChild
{
public bool SomeProperty { get; set; }
}
class SrcParent
{
public IEnumerable<SrcChild> Children { get; set; }
}
поэтому SrcParent имеет набор объектов SrcChild.
Теперь я хочу сопоставить экземпляр SrcParent с DstParent. Вот классы назначения:
class DstChild
{
public bool SomeProperty { get; set; }
public DstChild(DstParent parent)
{
if (parent == null)
throw new ArgumentNullException();
}
}
class DstParent
{
public IEnumerable<DstChild> Children { get; set; }
}
DstParent имеет коллекцию объектов DstChild, которые используют внедрение конструктора для сохранения ссылки на своего родителя.
Используя AutoMapper, я попробовал следующее:
class Program
{
static void Main(string[] args)
{
/* mapping configuration */
Mapper.CreateMap<SrcChild, DstChild>()
.ConstructUsing(
resolutionContext => new DstChild((DstParent)resolutionContext.Parent.DestinationValue));
Mapper.CreateMap<SrcParent, DstParent>();
/* source parent object with two children */
var srcParent = new SrcParent
{
Children = new[] { new SrcChild(), new SrcChild() }
};
/* throws an exception */
var dstParent = Mapper.Map<DstParent>(srcParent);
Console.ReadKey();
}
}
Основная часть здесь — это конфигурация AutoMapper, где я пытаюсь извлечь ссылку на созданный DstParent из контекста сопоставления. Это не работает ((DstParent)разрешениеContext.Parent.DestinationValue равно null), но, может быть, я здесь совершенно не понимаю?
Еще одна идея, которая у меня была, заключалась в том, чтобы использовать функцию для создания дочерних значений, что-то вроде этого:
class Program
{
/* Should produce value for DstParent.Children */
private static IEnumerable<DstChild> MakeChildren(SrcParent src /*, DstParent dstParent */)
{
var result = new List<DstChild>();
// result.Add(new DstChild(dstParent));
return result;
}
static void Main(string[] args)
{
/* mapping configuration */
Mapper.CreateMap<SrcChild, DstChild>();
Mapper.CreateMap<SrcParent, DstParent>()
.ForMember(dst => dst.Children,
opt => opt.MapFrom(src => MakeChildren(src /*, How to obtain a reference to the destination here? */)));
/* source parent object with two children */
var srcParent = new SrcParent
{
Children = new[] { new SrcChild(), new SrcChild() }
};
var dstParent = Mapper.Map<DstParent>(srcParent);
Console.ReadKey();
}
}
но я не знаю, как (если вообще возможно) получить ссылку на объект DstParent, созданный Mapper.
У кого-нибудь есть идея, как это сделать, или мне лучше подумать о том, чтобы вообще отказаться от этого дизайна и избавиться от родительской ссылки? Заранее спасибо.