在automapper中重用映射

时间:2014-04-17 03:43:29

标签: automapper

我现有的解决方案有很多重复:

config.CreateMap<IPublishedContent, ContactListingPage>()
            .ForMember(n => n.Title, map => map.ResolveUsing(AppearanceManager.GetTitle));
config.CreateMap<IPublishedContent, NewsListingPage>()
            .ForMember(n => n.Title, map => map.ResolveUsing(AppearanceManager.GetTitle));

有没有办法消除这种重复?
我尝试了使用界面:

config.CreateMap<IPublishedContent, IHaveTitle>()
            .ForMember(n => n.Title, map => map.ResolveUsing(AppearanceManager.GetTitle));

但实际的地图操作需要是具体类型,因此不使用此映射。

注意:我希望混合和匹配映射,所以所有页面都有标题,有些页面有促销等...

我试过了: 通过隐式转换为字符串为标题创建自定义类型,我认为这样做会“#39;工作除了我实际上需要IPublishedContent对象作为GetTitle方法的输入而不是它将从中映射的子属性PublishedProperty

1 个答案:

答案 0 :(得分:4)

AutoMapper并没有尝试按设计重用映射 - 主要是因为我会在这些情况下迷惑自己。您选择共享映射:

Mapper.Initialize(cfg => {
    cfg.CreateMap<IPublishedContent, IHaveTitle>()
        .ForMember(n => n.Title, map => map.ResolveUsing(AppearanceManager.GetTitle));

    cfg.CreateMap<IPublishedContent, ContactListingPage>()
        .IncludeBase<IPublishedContent, IHaveTitle>();
    cfg.CreateMap<IPublishedContent, NewsListingPage>()
        .IncludeBase<IPublishedContent, IHaveTitle>();
});

我通常非常小心这些,因为我不一定想在ViewModel端引入耦合。我已经通过共享解析器删除了复制。