Как просто сопоставить NHibernate ISet с IList с помощью AutoMapper - PullRequest
2 голосов
/ 09 ноября 2009

Я пытаюсь использовать AutoMapper для сопоставления DTO с моим Доменом.

Мой 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; }
}

Объекты My Domain, такие как:

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 берет массивы и конвертирует их в 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 модель домена в настоящее время анемична, но цель состояла в том, чтобы добавить бизнес-логику по мере нашего продвижения вперед. Я просто хочу убедиться, что моя модель представления может быть преобразована в модель предметной области и сохранена.

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

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

Ответы [ 2 ]

4 голосов
/ 10 ноября 2009

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

ForMember (dest => dest.Children, opt => opt.UseDestinationValue ())

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

1 голос
/ 09 ноября 2009

Ответ:

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

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

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