интерфейс карты Autopper для интерфейса или объекта - PullRequest
0 голосов
/ 26 июня 2019

Как сопоставить объекты, унаследованные от одного интерфейса, с объектами, унаследованными от другого интерфейса.

У меня такая структура кода

public interface IDataTranslatable
{
    List<DataTranslation> SpanishDataTranslations {get;set;}
}

public interface IDataTranslatableDto
{
    List<DataTranslationDto> DataTranslations { get; set; }
}

объекты DataTranslation и DataTranslationDto имеют одинаковые свойства. У меня есть много объектов, унаследованных от IDataTranslatable и IDataTranslatableDto интерфейсов. Например

public class Category : IDataTranslatable
{
    public string Name { get; set; }
    public ICollection<DataTranslation> SpanishDataTranslations { get; set; } = new List<DataTranslation>();
}

public class CategoryDto : IDataTranslatableDto
{
    public string Name { get; set; }
    public List<DataTranslationDto> DataTranslations { get; set; } = new List<DataTranslationDto>();
}

Лучшей реализацией для меня было бы что-то подобное

config.CreateMap<IDataTranslatable, IDataTranslatableDto>()
.ForMember(dest => dest.DataTranslations, opts => opts.MapFrom(src => src.SpanishDataTranslations));

Под этим я подразумеваю, что любой объект, унаследованный от IDataTranslatable, должен быть сопоставлен с объектом, унаследованным IDataTranslatableDto, с соответствующими полями.

Но это не сработает, поэтому я попытался отобразить вот так

config.CreateMap<IDataTranslatable, CategoryDto>()
.ForMember(dest => dest.DataTranslations, opts => opts.MapFrom(src => src.SpanishDataTranslations));

Ток с использованием

public class AutoMapperConfiguration : IAutoMapperConfiguration
{
    public void Configure(IMapperConfigurationExpression config)
    {
        IDataTranslatableMappings(config);
    }

    private void IDataTranslatableMappings(IMapperConfigurationExpression config)
    {
        var mapCategory = config.CreateMap<Category, CategoryDto>().ForMember(dest => dest.DataTranslations, opts => opts.MapFrom(src => src.SpanishDataTranslations));
    }
}

Этот вариант тоже не работает. Я пытался объяснить свою идею, как лучше это сделать?

1 Ответ

1 голос
/ 26 июня 2019

Вы можете настроить его следующим образом:

Mapper.Initialize(config =>
{
    config.CreateMap<IDataTranslatable, IDataTranslatableDto>()
                .ForMember(x => x.DataTranslations, y => y.MapFrom(src => src.SpanishDataTranslations));

    config.CreateMap<Category, CategoryDto>()
                .IncludeBase<IDataTranslatable, IDataTranslatableDto>();                    

    config.CreateMap<DataTranslation, DataTranslationDto>();
});

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

var translation = new DataTranslation()
{
    Test = "Foo"
};

IDataTranslatable category = new Category()
{
     SpanishDataTranslations = new List<DataTranslation> { translation }
};

var result = Mapper.Map<IDataTranslatableDto>(category);

Вам будет необходимо добавить каждую реализацию IDataTranslatable и IDataTranslatableDto к конфигурации сопоставления.

...