PostSharp для отображения объектов - PullRequest
0 голосов
/ 29 мая 2009

Я рассматриваю возможность использования PostSharp для сопоставления сущностей с DTO и DTO с сущностями. Выполнение этой задачи вручную для примерно 100 объектов было бы кошмаром обслуживания. Я посмотрел на AutoMapper на codeplex, но я думаю, что издержки могут быть серьезной проблемой в моем случае, кроме того, я чувствую, что PostSharp может дать мне дополнительный контроль над соглашением о сопоставлении. Если бы кто-нибудь мог поделиться каким-либо опытом с этим королем проблем, это было бы здорово.

Направление, в котором я думаю, примерно такое (пожалуйста, кто-нибудь, скажите мне, если это невозможно):

Аспект, который я планирую придерживаться класса, заполнит следующие два метода содержимым:

EntityType EntityToDTO(DTOType DTO) {}

DTOType DTOToEntity(EntityType Entity) {}

Первый метод вернул бы сущность на основе DTO, второй - противоположный. Внутри аспекта я планирую перебрать каждое свойство, создать новую цель и назначить значение свойства аналогу целевого объекта. Возможно ли это сделать во время компиляции без каких-либо накладных расходов во время выполнения?

Ответы [ 2 ]

1 голос
/ 30 мая 2009

Если это поможет, существует проект под названием PostSharp4ET, который в основном реализует поддержку объектов POCO в Entity Framework 1. См. http://www.codeplex.com/efcontrib.

Обратите внимание, что PostSharp не очень хорошо генерирует новый код. Это хорошо при смешивании нового кода с существующим. Если вам нужно сгенерировать код, я бы порекомендовал написать генератор кода C # на основе рефлексии и скомпилировать полученный код. Или используйте такой инструмент, как CodeSmith, как упоминалось ранее.

1 голос
/ 30 мая 2009

Если ваши имена полей DTO совпадают с именами полей вашей сущности, я бы использовал Duck Typing

http://www.deftflux.net/blog/page/Duck-Typing-Project.aspx

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

Ваш код будет работать так

UserDTO user = DuckTyping.Cast<UserDTO>(userEntity);

По сути, библиотека утиной печати будет отображать поля, сопоставляя имена. Они используют динамически генерируемый IL для архивирования этого.

Если это может быть слишком медленным, я, вероятно, попытался бы заставить CodeSmith генерировать методы для меня.

...