edi*_*ode 19 .net c# linq automapper
我一直在研究如何使用继承,AutoMapper
但我正努力让它完全运行Linq
.这是我的代码:
我在这里定义了我的映射:
CreateMap<Article, ArticleDetailsViewModel>()
.Include<Article, ArticleNewsItemDetailsViewModel();
CreateMap<Article, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)
ArticleDetailsViewModel
是一个基类ArticleNewsItemDetailsViewModel
.
现在问题在于,如果我有:
CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)
视图模型中的所有属性都将自动映射,因为它们与Linq对象相同.但是,因为我使用Article => ArticleNewsItemDetailsViewModel
映射这是不可能的,相反,我必须将每个定义为:
.ForMember(x => x.Property1, opt => opt.MapFrom(src => src.ArticleNewsItem.Property1)
Run Code Online (Sandbox Code Playgroud)
我想过将所有属性从ArticleNewsItemDetailsViewModel
一个新的视图模型中移出并让该类成为一个属性ArticleNewsItemDetailsViewModel
,只要这两个对象之间存在映射,它就可以工作,但感觉不是很干净.
有什么方法可以避免这样做吗?
如果我在头脑中过度简化了这一点,我深表歉意,但您不能简单地添加您提到的直接映射吗:
CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)
对我来说,这是最简单、最干净的解决方案......
编辑 抱歉,我误解了。如果不通过 .ConstructUsing() 或 .ConvertUsing() 方法(或以不整洁的方式进行)创建自定义映射,则无法将对象映射到嵌套属性...
Mapper.CreateMap<Article, ArticleNewsItemDetailsViewModel>().ConstructUsing(ConstructItem)
Run Code Online (Sandbox Code Playgroud)
..然后创建方法来构建 ArticleNewsItemDetailsViewModel...
private static ArticleNewsItemDetailsViewModel ConstructItem(Article source)
{
var newsItem = new ArticleNewsItem
{
Prop1 = source.Prop1,
Prop2 = source.Prop2
};
var result = new ArticleNewsItemDetailsViewModel()
{
ArticleNewsItem = newsItem
};
return result;
}
Run Code Online (Sandbox Code Playgroud)
不过,我仍然建议重新实施您的解决方案,以便您映射“同类”。这是一个很好的例子:http://automapper.codeplex.com/wikipage? title=Nested%20Mappings
归档时间: |
|
查看次数: |
1093 次 |
最近记录: |