мы использовали Automapper на некоторое время, и мы считаем, что это отличная утилита, спасибо за ее создание!Как сопоставить внутренние свойства с помощью Automapper?
Однако, у нас есть вопрос:
Вопрос
«Как настроить AutoMapper отобразить свойства источника на внутреннее свойство назначения?»
фон
В нашей многоуровневой архитектуре, Dto не объекты не покидают слой доступа к данным, только объекты домена могут проходить в и из слоя доступа к данным. Таким образом, из домена POV объекты домена не должны содержать никаких знаний базы данных. Однако в действительности идентификаторы базы данных очень полезны для переноса - ожидайте, что разработчик «бизнес-уровня» не должен знать о них.
Решение: добавьте идентификаторы базы данных в объект домена, но продайте их как внутренние, чтобы они не подвергались воздействию «бизнес-уровня». Затем выведите общий слой (который владеет объектами домена) на уровень доступа к данным. Задача решена. Ожидаем, что мы не сможем выяснить, как заставить Automapper (> v3.3.0) работать с нашими внутренними свойствами.
In, версия 3.3.0 BindingFlags
были выставлены, которые используют для решения проблемы.
Пример
Common.Dll
public class Person
{
public Parent Father { get; set; }
internal int FatherId {get; private set; }
}
DataAccess.dll
internal class PersonDto
{
public ParentDto Father { get; set; }
public int FatherId {get; private set; }
}
В нашем классе Profile мы CreateMap<PersonDto, Person>();
Edit 1 - Исправлена опечатка в обратном типе Отца.
Edit 2 - Добавлен подробнее ..
В Common.Dll, у нас есть услуги что-то вроде этого:
public class ParentService
{
public Parent GetFather(Person person)
{
return repo.Parents.FirstOrDefault(parent => parent.Id = person.Father.Id);
}
}
И в Business.Dll мы имеем разработчика с использованием Услуг что-то вроде этого:
var father = parentService.GetFather(son);
// use father separately or assign it to the son. Like so:
// son.Father = father;
Все дело в том, что мы не хотим, чтобы бизнес-разработчик, чтобы иметь доступ к son.FatherId
из Businssess.Dll, и у них нет доступа к объекту Dto, который создал объект домена.
Таким образом, все знания базы данных инкапсулируются внутри различных служб Common.dll или в DataAccess.dll.
Спасибо.