Используя в своих приложениях доменную модель (Domain Model), как способ организации бизнес логики, в сервисах приложения сталкиваешься с постоянной необходимостью преобразования объектов домена в объекты данных (Data Transfer Object - DTO) для передачи их во внешние системы, различным клиентским приложениям и т.п. К сожалению, для .NET я смог найти только следующие библиотеки:
Со второй не получилось даже толком познакомится, т.к. ни документации, ни примеров я не обнаружил (но как я понял из исходников, она не дотягивает до следующих двух). Последние две направлены в большей мере на решение O/R M задач, и поддерживают O/O M как подмножество функций необходимых для решения основных задач (объектно-реляционная проекция), поэтому отсутствие необходимых, для решения моей задачи, функций и наличие в них лишних функций (мой O/R M меня устраивает :-)) вынудили меня вычеркнуть их из списка. Таким образом осталось только одна библиотека - Otis.
Сразу скажу, что и она меня не удовлетворила, не смотря на положительное первоначальное впечатление. И так почему оно возникло? Otis специально создан для отображения объектов домена на DTO и, соотвественно, имеет достаточный набор функций для безболезненного осуществления этого процесса. Пример конфигурации преобразования с использованием Otis:
<?xml version="1.0" encoding="utf-8" ?>
<otis-mapping xmlns="urn:otis-mapping-1.0">
<class name="Otis.Sample.Presentation.ArtistInfo, Otis.Sample" source="Otis.Sample.Domain.Artist, Otis.Sample" >
<member name="Id" />
<member name="Description" expression="[$Name + ' [' + $Country + ']' ]" />
<member name="Records" />
<member name="RecordCount" expression="$Records.Count" />
</class>
<class name="Otis.Sample.Presentation.RecordInfo, Otis.Sample" source="Otis.Sample.Domain.Record, Otis.Sample" helper="ConversionHelper" >
<member name="Id" />
<member name="Description" expression="[$Name + ' [' + $YearPublished + ']' ]" />
<member name="SongCount" expression="$Songs.Count" />
<member name="TotalCommentCount" expression="count:$Songs/Comments" />
<member name="AverageSongRating" expression="avg:$Songs/Ratings/Value" />
<member name="AverageSongDuration" expression="avg:$Songs/DurationInSeconds" format="{0:N2} seconds" />
<member name="AlbumDuration" expression="sum:$Songs/DurationInSeconds" />
<member name="Category" expression="$Style" >
<map from="['Pop']" to="Pop"/>
<map from="['Punk']" to="Rock"/>
<map from="['Rock']" to="Rock"/>
<map from="['Classical']" to="Classical"/>
</member>
</class>
</otis-mapping>
Критические недостатки реализации Otis-lib:
- невозможность использования в серверных приложениях (отсутствует поддержка многопоточности, кэша сгенерированных классов, сборок);
- использование CodeDom для генерации кода преобразователей;
- нерасширяемая архитектура;
Ко всем недостаткам реализации добавляются низкие темпы развития проекта. Со всеми этими недостатками Otis-lib становится непригодной в использовании на реальных проектах.
Мои поиски продолжаются, может быть Вы знаете еще о каких-нибудь преобразователях (object to object mapper)?
Лучшие библиотеки:
ReplyDeleteautomapper.codeplex.com (самая известная)
emitmapper.codeplex.com (самая быстрая и гибкая)
Да, про автомаппер я писал(http://mind-injection.blogspot.com/2009/02/objectobject-mapping-automapper.html), но на момент написания этой статьи его еще не было.
ReplyDeleteЗа вторую ссылку большое спасибо, посмотрю.
http://gandjustas.blogspot.com/2010/01/blog-post.html - еще один o/o mapper.
ReplyDelete