2016-03-20 4 views
1

мы использовали 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.

Спасибо.

ответ

0

Этот вопрос является ответом here.

Цитирую ответ для Вашего удобства:

Просто установите ShouldMapProperty свойство вашего объекта конфигурации в методе инициализации.

Вот пример использования статического API, однако вы должны иметь возможность , чтобы добиться аналогичного эффекта, используя нестатический API.

Mapper.Initialize(i => 
{ 
    i.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly; 
    i.CreateMap<Source, Target>();     
});