2009-11-09 3 views
2

Я пытаюсь использовать AutoMapper для сопоставления из DTO в мой домен.Как просто сопоставить ISet NHibernate с IList с помощью AutoMapper

Мой DTO может выглядеть так:

public class MyDTO 
{ 
    public string Name { get; set; } 
    public bool OtherProperty { get; set; } 

    public ChildDTO[] Children { get; set;} 
} 

public class ChildDTO 
{ 
    public string OtherName { get; set; } 
} 

Мои доменные объекты, как это:

public class MyDomain 
{ 
    public string Name { get; set; } 
    public bool OtherProperty { get; set; } 
    public ISet<ChildDomain> Children { get; set; } 
} 

public class ChildDomain 
{ 
    public string OtherName { get; set; } 
} 

Как мне установить AutoMapper, чтобы иметь возможность сопоставить с этим массива до Сета. Кажется, что AutoMapper берет Array и преобразовывает их в IList, а затем отказывается при конвертации в ISet.

Вот исключение

Unable to cast object of type 'System.Collections.Generic.List`1[DataTranser.ChildDTO]' to type 'Iesi.Collections.Generic.ISet`1[Domain.ChildDomain]'. 

Я надеюсь найти простой общий способ сделать это так, что я могу минимизировать инфраструктуру, необходимую для сопоставления с DTO, чтобы домен. Любая помощь приветствуется.



UPDATE:
Итак, как бы я модель MyDomain -> ChildDomain, не прекращая с анемией модели предметной области? Я понимаю, что без бизнес-логики в MyDomain или ChildDomain модель домена в настоящее время анемична, но целью было добавить бизнес-логику, когда мы продвигаемся вперед. Я просто хочу убедиться, что модель View Model может быть переведена в модель домена и сохранена.

Что вы предложите для этого сценария, перейдя от простого сопоставления между представлением и доменом, а затем добавив в бизнес-правила?

Еще раз спасибо за помощь.

+0

И ваша конфигурация automapper ...? – Paco

+0

Отображение только для отдельных элементов: Mapper.CreateMap (); Mapper.CreateMap (); Не уверен, как я собирался создать сопоставление для Set, thats основная предпосылка вопроса. Спасибо за помощь. – Kas

+0

Я попробовал Mapper.CreateMap () и закончил с исключением – Kas

ответ

1

Ответ:

  1. Вы должны создать свой собственный IObjectMapper, чтобы отобразить пользовательскую коллекцию как Исеть
  2. Создайте свой собственный экземпляр конфигурации со всеми стандартными objectmappers и ваш новый setobjectmapper.
  3. Используйте экземпляр IMappingEngine, созданный с конфигурацией, с помощью вашей собственной objectmapper вместо статического класса AutoMapper.Mapper .

Некоторые замечания:

  • Легко настроить конструкцию IMappingEngine в инверсии управления контейнера.
  • Источником самого automapper может помочь вам создать реализацию IObjectMapper.
  • Вы используете automapper в противоположном направлении для того, для чего он предназначен: он предназначен для сопоставления сложных объектов с простыми объектами. Вы пытаетесь сопоставить простой DTO с сложным объектом. (Это не значит, что вам не сложно то, что вам нужно, с automapper, но в будущем вы можете столкнуться с различными проблемами)
  • Вы используете антиаммологическую модель модели анемичного домена.Домен должен держать всю бизнес-логику, поэтому она не должна подвергать сложную коллекцию, как Исеть (и никаких государственных сеттер для коллекций на всех)
4

Если ваша настойчивость слой просто, используя UseDestinationValue() расскажет AutoMapper не заменить основной коллекции:

ForMember (Dest => dest.Children, опт => opt.UseDestinationValue())

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

+0

Полученная же проблема: простой ISet . Значение в моем DTO пусто (null), и из-за этого я думаю, что он делает IList. С большой надеждой я попробовал строку кода выше, но она по-прежнему дает ту же ошибку здесь. – Gigi2m02

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