我在需要时明确加载了POCO上的关系,但是自从我切换到AutoMapper后,我想我可以指示它为我预加载关系,以便我的服务层代码看起来更干净:
Mapper.CreateMap<Issue, IssueEditModel>().BeforeMap((i, m) =>
LoadProperties<Issue>(() =>
{ return kernel.GetService<IIssuesRepository>(); },
i, new Expression<Func<Issue, object>>[]
{
e => e.RelationshipA,
e => e.RelationshipB
}
)
);
LoadProperties方法使用DependencyResolver查找存储库,并使用ObjectContext的LoadProperty方法加载列出的关系。现在,我的服务可以通过单个Mapper.Map调用轻松地将EF POCO映射到视图模型。
以前有人试过这个吗?什么是潜在的陷阱?将所有这些LoadProperty调用保留在服务/存储库层中并使AutoMapper映射尽可能简单是否有意义?
让我感到困扰的是,你可以让AutoMapper为你做很多繁琐的工作,例如在从视图模型转换为POCO时转换类型和按ID查找实体,但同时这会从你的“逻辑”移动服务/存储库到AutoMapper配置。如果您对此有丰富的经验,请分享您的想法。
答案 0 :(得分:0)
我一直在阅读更多关于域驱动设计和Web应用程序中图层职责的内容,现在我意识到我一直在滥用AutoMapper。仅仅因为我可以做到这些并不意味着我应该这样做。其中一个陷阱是测试。因为我对AutoMapper的调用最终会命中数据库以解决某些关系,所以我不能使用这些映射来进行单元测试,所以我必须为我的测试创建一组不同的映射。
您的存储库应预先加载必要的关系。人们建议让方法接受控制是否应使用Include加载某个关系的标志。在我的情况下,我认为当实体处于多方面以及检索单个实体时的所有关系时,我将始终加载多对一关系(例如,对于详细视图)。