Сопоставить DTO с базовой моделью с помощью защищенного конструктора - PullRequest
0 голосов
/ 13 февраля 2020

Все мои классы моделей имеют один конструктор 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 для каждого сопоставления отдельно?

...