2010-09-03 3 views
3

Вот код для картографа:выпуск с AutoMapper и картография IEnumerable коллекции

public IEnumerable<GetQuestionsContract> Map(IEnumerable<XmlNode> nodes, XmlNamespaceManager namespaceManager) 
    { 
     Mapper.CreateMap<XmlNode, GetQuestionsContract>() 
      .ForMember(
       dest => dest.Id, 
       options => 
       options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
        source => source.SelectSingleNode("//wfauth60xsd:questionID", namespaceManager))) 
      .ForMember(
       dest => dest.Question, 
       options => 
       options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
        source => source.SelectSingleNode("//wfauth60xsd:question", namespaceManager))); 

     return Mapper.Map<IEnumerable<XmlNode>, List<GetQuestionsContract>>(nodes); 
    } 

В то время как это работает, это только кажется, что возвращает первый элемент в IEnumerable список несколько раз (столько раз, сколько их являются элементы в XmlNodeList).

Обновление: Я упростил код и обновил заголовок. Сценарий работает отлично, если я сопоставляю один XmlNode, но перечисление, похоже, является проблемой. Например, следующий код работает очень хорошо:

public SomeIdContract Map(XmlDocument document, XmlNamespaceManager namespaceManager) 
    { 
     Mapper.CreateMap<XmlDocument, SomeIdContract>() 
      .ForMember(
       dest => dest.Id, 
       options => 
       options.ResolveUsing<XmlNodeResolver<string>>().FromMember(
        source => source.SelectSingleNode("//wfauth60msgs:someID", namespaceManager))); 

     return Mapper.Map<XmlDocument, SomeIdContract>(document); 
    } 

Любые мысли? Благодаря!

+0

что-то похожее и с другой технологией сопоставления, это может помочь мне: http://valueinjecter.codeplex.com/Thread/View.aspx?ThreadId=218448 – Omu

+0

Спасибо - я пробовал аналогичный подход, но никуда не денутся. Я отправлю ответ, чтобы показать, что у меня получилось ... –

ответ

1

Похоже, что проблема связана не с AutoMapper, а с XPath, выбирая первый узел по какой-то сумасшедшей причине.

Преобразование XmlDocument в XDocument и использование Linq-to-Xml решило мою проблему.

Спасибо за ввод.

3

У меня была такая же проблема. Оказывается, AutoMapper использовал свойство Id (Guid) моего объекта модели (которое обычно устанавливается частным образом nhiberate) как идентификатор при кешировании источника (независимо от того, какие другие свойства отличались). Во время тестирования я никогда не устанавливал идентификатор, поэтому руководство по умолчанию было одинаковым для всех объектов, что объясняло, почему только первый элемент в IEnumerable был возвращен для всех. Поэтому я должен был сделать Id публичным для моих тестов, установить Id для каждого элемента, а затем все сработало.

+0

Я тоже это видел. Похоже, что automapper ищет какое-то поле идентификатора. Я также не устанавливал этот идентификатор в своем тестировании, потому что это не имело значения, но это заставило automapper думать, что все элементы в коллекции были одинаковыми. – SouthShoreAK

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