Все мои классы моделей имеют один конструктор c, который принимает сеанс / единицу рабочего объекта (требуется для ORM, который я использую). Однако они также наследуются от общего базового класса XPObject с защищенным конструктором, который требует этот объект сеанса, например
public class XPObject
{
protected XPObject(Session session) { ... }
}
public class Person
{
public Person(Session session) : base(session) { ... }
}
Все DTO, в свою очередь, наследуют от общего базового класса EntityDto, который имеет конструктор по умолчанию.
Мои сопоставления выглядят примерно так:
cfg.CreateMap<PersonDto, Person>();
Когда я пытаюсь сопоставить DTO с новым объектом, таким как
mapper.Map<Person>(dto);
, я получу ожидаемую ошибку, что объект не может быть создан, потому что у него нет пустого конструктора.
Я попытался настроить маппер для решения этой проблемы с помощью параметра ForCtorParam:
CreateMap<EntityDto, XPObject>()
.DisableCtorValidation()
.ForCtorParam("session", _ => _.MapFrom((dto, ctx) => ctx.Mapper.ServiceCtor(typeof(UnitOfWork))))
.IncludeAllDerived();
К сожалению, это не удается, поскольку конструктор Класс XPObject защищен.
Как решить эту проблему, не настраивая CtorParam для каждого сопоставления отдельно?