LINQ to XML, ORM или что-то «совершенно другое»? - PullRequest
3 голосов
/ 20 января 2009

Я работаю над проектом Silverlight со всеми необходимыми функциями и ограничениями. Это обновление к предыдущему продукту. Чтобы быстро выйти на рынок, цель состоит в том, чтобы поддерживать как можно большую часть серверной части (веб-сервисы, базы данных и т. Д.). Наш мандат состоит в том, чтобы касаться только бэк-энда, если другого пути нет. В первую очередь мы сосредоточимся на переписывании внешнего интерфейса. Вскоре состоится важная отраслевая конференция, на которой мы хотим продемонстрировать ранний вид продукта. Может быть, до официального релиза может быть какое-то время переделывать, но бэкэнд может подождать до V2.

ОК, поэтому я пытаюсь использовать шаблон MVVM с привязкой данных для внешнего интерфейса, за который я отвечаю (шаблон MVVM продиктован сверху). У меня есть pre-existig веб-сервис, который обслуживает некоторые XML. Пример этого XML выглядит следующим образом:

<CODEBOOKINDEX>
    <ME Words="1" Score="25" Highscore="1">Main Entry Item
        <NM>attack</NM>
        <NM>cardiac</NM>
        <NM>chest</NM>
        <NM>effort</NM>
        <NM>heart</NM>
        <NM>pectoris</NM>
        <NM>syndrome</NM>
        <NM>vasomotor</NM>
        <IE>413.9</IE>

        <M1 Words="1" Score="25">An M1 Item (Same as ME, just first level Child)
            <IE>557.1</IE>
        </M1>

        <M1 Words="1" Score="25">Another M1 Item
        <IE>443.9</IE>
            <M2 Words="1" Score="25">An M2 Item (again same as ME, just a child of an M1 item)
                <CF>Arteriosclerosis,extremities</CF>
                <IE>440.20</IE>
            </M2>
        </M1>
    </ME></CODEBOOKINDEX>

Итак, мой вопрос, так как я хочу связать это с пользовательским интерфейсом, используя шаблон MVVM, мне кажется, что мне нужно перевести это в пользовательский объект. Как вы можете видеть, есть несколько элементов «Entry», MainEntry (ME) и Subentries (в данном примере M1 или M2), все они будут содержать определенные другие узлы (например, все они будут иметь узел IE), они МОЖЕТ содержать 0 или более других типов узлов (например, они МОГУТ или могут не содержать один или несколько узлов NM, или МОГУТ содержать один узел CF или нет). Что означает (по крайней мере, для меня), что я не могу напрямую связываться с XML, потому что:

  1. Это нарушает шаблон MVVM (я, вероятно, мог бы оправдать это для демонстрации, но позже пришлось бы провести рефакторинг).
  2. Я не могу действительно привязать элемент пользовательского интерфейса к узлу XML, который МОЖЕТ отсутствовать для данного элемента.
  3. В некоторых случаях мне приходится переводить коллекцию (например, группу предметов NM) в форматированный стриг для демонстрации, что, как мне кажется, не тривиально.

Итак, я пытаюсь понять, как лучше всего перевести этот XML в связываемый объект, что, на мой взгляд, означает преобразование этого XML в объект для модели и затем наложение модели представления на эту модель.

Может ли это быть легко сделано с помощью запросов LINQ to XML, или я действительно перехожу в область ORM, такую ​​как NHibernate или Entity Framework (никаких священных войн из-за КАКОГО ORM, пожалуйста)?
Я только что установил, какие элементы управления я буду использовать для пользовательского интерфейса, и мне нужно довольно быстро продемонстрировать своему менеджеру КАК Я собираюсь обработать перевод.

Итак, реальные вопросы:

  1. Мне НУЖНО ОРМ? Я не против их использования, но я хочу, чтобы размер файла XAP был небольшим, и хочу ограничить количество новых технологий, которые мне (и моим товарищам по команде) необходимо освоить за один проход.
  2. Если он мне нужен, могу ли я уменьшить размер файла и быстро ли увеличить его с помощью EF или NHibernatge и получить модель, которая будет показана очень скоро? Я говорю здесь как неделя, чтобы иметь ЧТО-ТО , которое будет извлекать выходные данные из веб-сервиса и превращать его в объект, даже если карта изначально не идеальна, мне нужно продемонстрировать некоторый прогресс.
  3. Есть ли вообще другой вариант, который я не рассматриваю, который может быть проще, ограничить необходимость изменения существующего кода (т. Е. Веб-службы) и полезных результатов продукта?

1 Ответ

9 голосов
/ 20 января 2009

НУЖНА ЛИ ОРМ?

Нет. Вы не отображаете реляционный источник, поэтому объектный реляционный маппер не поможет.


Сделайте это с Linq to Xml .

public CustomClass TranslateME(XElement source)
{
  CustomClass result = new CustomClass();
  result.Words = (int) source.Attribute("Words");
  result.Score = (int) source.Attribute("Score");

  XAttribute highScore = source.Attribute("HighScore");
  result.HighScore = (highScore == null) ? 0 : (int) highScore;

  result.NMs = source
    .Elements("NM")
    .Select(x => x.Value)
    .ToList();

  result.IE = source
    .Element("IE").Value;

  result.SubEntries = source
    .Elements("M1")
    .Select(x => TranslateM1(x))
    .ToList();

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