Automapper: средство форматирования для свойства интерфейса - PullRequest
1 голос
/ 30 июля 2010

Если у меня есть несколько классов, которые реализуют один и тот же интерфейс, они все содержат одно и то же свойство. Есть ли способ добавить форматер к этим свойствам? Я нашел только возможность добавить форматер к определенному типу свойства.

Вот код, который должен прояснить, что я имею в виду:

public interface ITaggable
{
    IList<string> Tags { get; set; }
}

public class Post : ITaggable
{
    public IList<string> Tags { get; set; }
    public IList<string> Categories { get; set; }
    ...
}

public class Page : ITaggable
{
    public IList<string> Tags { get; set; }
    ....
}

Я бы хотел сопоставить их для просмотра моделей, которые выглядят примерно так:

public class PostViewModel
{
    public string Tags { get; set; }
    public IList<string> Categories { get; set; }
    ...
}

public class PageViewModel
{
    public string Tags { get; set; }
    ...
}

Если Post имеет теги "foo" и "bar", то свойство PostViewModel 'Tags должно содержать строку "foo, bar". Categories должен остаться IList<string>.

Я мог бы сделать это, создав пользовательский форматер, а затем добавить его при каждом отображении, например:

protected override void Configure()
{
    CreateMap<Post, PostViewModel>()
        .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>());
    CreateMap<Page, PageViewModel>()
        .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>());
}

Но я бы хотел сделать что-то подобное (этот код не работает; -)

protected override void Configure()
{
    ForSourceType<ITaggable>()
        .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>());

    CreateMap<Post, PostViewModel>();
    CreateMap<Page, PageViewModel>();
}

1 Ответ

0 голосов
/ 18 августа 2010

Это не совсем ответ на вопрос, который я задавал, но решение проблемы:

Я построил TagsFormatter, который проверяет имя свойства для «Теги»:

public class TagsFormatter : IValueFormatter
{
    public string FormatValue(ResolutionContext context)
    {
        if (context.MemberName.Equals("Tags", StringComparison.InvariantCultureIgnoreCase))
        {
            var tags = context.SourceValue as IList<string>;
            if (tags != null)
                return String.Join(", ", tags);
        }
        return context.SourceValue.ToString();
    }
}

В конфигурации я могу зарегистрировать этот форматер для всех отображений:

public class ViewModelProfile : AutoMapper.Profile
{
    protected override void Configure()
    {
        ForSourceType<IList<string>>().AddFormatter<TagsFormatter>();

        CreateMap<Post, PostViewModel>();
        CreateMap<Page, PageViewModel>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...