Emit Mapper Лесть и несоответствие имени свойства - PullRequest
1 голос
/ 08 марта 2012

Как сопоставить класс User с классом UserModel с помощью Emit Mapper?

    public class User
    {
        public Guid Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public IList<Role> Roles { get; set; }

        public Company Company { get; set; }        
    }

    public class UserModel
    {
        public Guid Id { get; set; }

        public Guid CompanyId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }      

        public IList<RoleModel> Roles { get; set; }
}

Есть несколько проблем:

  • Мне нужно сгладить объект так, чтобы вместо него был CompanyIdобъекта Company.
  • Объект Company имеет свойство Id, в UserModel у меня есть CompanyId, который соответствует идентификатору компании, но имена свойств не совпадают.
  • Мне нужно сопоставить List<Role>до List<RoleModel>

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Чтобы получить плоскую модель, вы можете проверить в этом примере .Но, по-видимому, по умолчанию в качестве префикса в цели используется соглашение о том, что имя свойства подкласса должно быть

Источник

public class SourceObject
{
public SourceSubObject SomeClass { get; set; }
}

public SourceSubObject
{
    public int Age { get; set; }
}

Target

public class Target
{
public int SomeClassAge  { get; set; }
}

Во-вторых, один из вариантов - позволить настройкам по умолчанию скопировать те свойства, которые он может скопировать, и сделать остальное вручную

var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>().Map(source);
target.CompanyId = target.Company.CompanyId;

Или, если вам необходимо повторно использовать сопоставлениеСоздание пользовательского сопоставления

Настраиваемое сопоставление

private Target Converter(Source source)
{
   var target = new Target();
   target.CompanyId = source.Company.CompanyId;
   return target;
}

Использование

var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);

Обновление

Что входит в отображение Role & RoleModel.Похоже, что в этом случае вам нужно включить глубокое копирование, и в зависимости от определений классов вы можете либо скопировать его напрямую, либо выполнить какое-либо пользовательское сопоставление.

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
0 голосов
/ 18 мая 2012
  • Для лестности я использовал конфигурацию из примеров в исходных файлах Emit Mapper: http://emitmapper.codeplex.com/SourceControl/changeset/view/69894#1192663

  • Для того, чтобы имена соответствовали классу компании, должно быть поле с именем Id

  • Для отображения List<Role> на List<RoleModel> Я использовал пользовательский конвертер:

    public class EntityListToModelListConverter<TEntity, TModel>
    {
        public List<TModel> Convert(IList<TEntity> from, object state)
        {
            if (from == null)
                return null;
    
            var models = new List<TModel>();
            var mapper = ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TModel>();
    
            for (int i = 0; i < from.Count(); i++)
            {
                models.Add(mapper.Map(from.ElementAt(i)));
            }
    
            return models;
        }
    }
    

    Итак, все вместе:

     var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
                 new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
                 new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>))));
    
  • При использовании конфигурации Flatterning с пользовательскими преобразователями возникла проблема. Проверьте мой вопрос: Emit Mapper Flattering с пользовательскими преобразователями

...