2016-08-19 6 views
1

Мне нужно сделать некоторое сопоставление между объектами (например, PersonModel to PersonViewModel) и изучать различные подходы к этому. В частности, я работаю с Entity Framework и пытается сопоставить сгенерированные модели с viewmodel.Каковы различные подходы к сопоставлению объектов и объектов в .NET?

Однако я еще не нашел статью или ресурс, который компилирует список того, как вы можете это сделать. До сих пор, я наткнулся на следующее:

  • неявное преобразование (я думаю, что это самый основной подход, так как вы вручную сопоставить свойства одного объекта к другому, его простые, но утомительные?)
  • Методы расширения (не работал с этим пока)
  • отражения (я переделал немного, но только удались очень простое отображение)
  • Automapper (очень популярный, но у меня возникают проблемы, делая это хорошо работать с EF)
  • Value Injecter (еще не сработал)
  • Испустите Mapper (не работал с этим еще, но, вероятно, я бы проблемы, делая его работу с EF?)

Можете ли вы помочь указать, и более подробную информацию о подходах, имеющихся там, а также профи/минусы каждого? Например, я видел некоторые, которые упомянули, что Automapper медленный по сравнению с ручным отображением? Или, возможно, укажите статью, которая занимается этим?

EDIT: так как некоторые из них могут спросить, что проблема у меня с AutoMapper, пожалуйста, увидеть это: Automapper: How to map IList to EntityCollection

+0

Вы спрашиваете о целой статье или даже книге. SO - это сайт Q & A. И Automapper не имеет проблем с работой с EF, главным образом потому, что объекты, возвращаемые EF, являются обычными объектами. Если вы используете специальные классы EF, такие как 'EntityCollection', вы делаете это неправильно. Проверьте все обучающие программы, и вы увидите, что они используют самый простой 'ICollection ' –

ответ

2

Ну, я могу дать вам путь, где вы делаете свое собственное отображение, довольно просто сделать, и может быть выполнен быстро за большой объем данных. Я покажу вам, что я буду делать, а затем попытаюсь выяснить, почему я делаю то, что делаю. Здесь идет:

public class PersonViewModel 
{ 
    public static Expression<Func<Person, PersonViewModel>> FromPerson 
    { 
     get 
     { 
      return p => new PersonViewModel 
      { 
       Name = p.FirstName, 
       SurName = p.LastName 
      }; 
     } 
    } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public static PersonViewModel CreateViewModel(Person original) 
    { 
     var func = FromPerson.Compile(); 
     var vm = func(original); 

     return vm; 
    } 
} 

Теперь вы заметите, что у меня есть 2 способа преобразования из модели Person EF к ViewModel. Это связано с тем, что первый, который использует выражение>, используется для преобразования большой массы объекта в оператор Select(). Простое использование:

return people.Select(PersonViewModel.FromPerson); 

В этом случае мы, вероятно, извлекается коллекция Person объектов из БД и должны показать им, скажем, в списке или что-то, но с использованием ViewModel. Таким образом, операция выполняется навалом и намного быстрее, чем просто создание всех объектов с помощью другого метода. Теперь статический метод CreateViewModel можно использовать для сопоставления одного объекта, когда это необходимо. Например, если вы получили данные одного пользователя из БД и должны их показать, но с помощью ViewModel. В этом случае было бы целесообразно использовать статический метод вместо выражения, который в основном предназначен для массовых преобразований.

Это то, что я могу предложить, кроме того, что задается вопросом, что не так с помощью AutoMapper, так как это довольно просто, и вы на самом деле не разбираетесь в том, что проблема с его использованием вместе с EF. Надеюсь, это поможет вам хотя бы немного в вашей проблеме :)

+0

. Я бы предположил, что 'CreateViewModel' будет использовать' FromPerson' для уменьшения дублирования кода.Почти любое отображение в реальной жизни будет иметь гораздо больше свойств, поэтому применение метода DRY (Do not Repeat Yourself) имеет смысл. – Phil1970

+0

Ах, ты прав, я на самом деле забыл об этом, так как я написал его на лету, спасибо за исправление, исправит это. –

 Смежные вопросы

  • Нет связанных вопросов^_^