Утилита сопоставления объектов с объектами - PullRequest
5 голосов
/ 16 мая 2009

Мне нравится четко отделять общедоступные и доменные объекты (поэтому nHibernate здесь не поможет) друг от друга, что в итоге заставляет меня писать много кода для сопоставления одного объекта другому , Какие инструменты / плагины существуют, чтобы устать от необходимости вручную делать это отображение в .NET? M. Когда я Google это делаю, он думает, что я хочу сделать ORM, который не , что я ищу. Спасибо!

РЕДАКТИРОВАТЬ 19: 33CST: ОК, я написал очень простое приложение (очень быстро написанный код), которое демонстрирует то, что я ищу. Мне просто интересно, есть ли плагин VS, который сделает это для меня.

VS2008 Solution

Ответы [ 4 ]

14 голосов
/ 16 мая 2009

Возможно, вы захотите попробовать AutoMapper . Похоже, что вы ищете.

6 голосов
/ 19 мая 2009

Итак, казалось бы, недовольный решением времени выполнения, я написал небольшую утилиту, которая будет создавать сопоставления в коде. Вы можете скачать исходный код ниже и написать лучшую обработку ошибок и т. Д., И т. Д. Я был бы признателен за любые интересные изменения, которые вы делаете, это было сделано на скорую руку, но работает. Пожалуйста, обратите внимание, что код выпускается под LGPL .

Исходный код утилиты сопоставления объектов с объектами

ОБНОВЛЕНИЕ 23 ИЮНЯ 2009 : Я сделал несколько обновлений в коде, который его очистил (немного), а также добавил возможность сохранять сопоставление в файл, чтобы вы могли позже изменить его.

3 голосов
/ 15 июня 2010

используйте ValueInjecter , с его помощью вы можете сопоставить что угодно с чем угодно, например

  • объект <-> объект
  • object <-> Form / WebForm
  • DataReader -> object

и имеет классные функции, такие как: сплющивание и отстегивание

3 голосов
/ 16 мая 2009

Существует также интересный проект под названием Otis . Ниже приведен пример сопоставления * .otis.xml, взятого со страницы документации:

<?xml version="1.0" encoding="utf-8" ?> 
<otis-mapping xmlns="urn:otis-mapping-1.0">
<class name="Otis.Tests.UserDTO, Otis.Tests" source="Otis.Tests.Entity.User, Otis.Tests" >
    <member name="Id" />
    <member name="Age" />
    <member name="UserName" expression="$UserName.ToUpper()" nullValue="[unknown]" />
    <member name="FullName" expression="[$FirstName + ' ' + $LastName]" />
    <member name="ProjectCount" expression="$Projects.Count" />
    <member name="Title" expression="$Gender" >
        <map from="Gender.Male" to="Mr." />     <!-- projections -->
        <map from="Gender.Female" to="Mrs." />
    </member> 
    <member name="Birthday"  expression="$BirthDate" format="Born on {0:D}"/>
    <member name="ProjectCount" expression="$Projects.Count" />
    <member name="AvgTaskDuration" expression="avg:$Projects/Tasks/Duration" />
    <member name="MaxTaskDuration" expression="max:$Projects/Tasks/Duration" />             
</class>

Чтобы прочитать файлы сопоставления из сборки:

// configure the new Configuration object using metadata of types in the current assembly
Configuration cfg = new Configuration();            // instantiate a new Configuration, one per application is needed
cfg.AddAssembly(Assembly.GetExecutingAssembly());   // initialize it

Хм, где я видел это раньше? ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...