具有显式加载的AutoMapper和Entity Framework POCO

时间:2011-08-03 21:27:24

标签: asp.net-mvc entity-framework asp.net-mvc-3 automapper

我在需要时明确加载了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配置。如果您对此有丰富的经验,请分享您的想法。

1 个答案:

答案 0 :(得分:0)

我一直在阅读更多关于域驱动设计和Web应用程序中图层职责的内容,现在我意识到我一直在滥用AutoMapper。仅仅因为我可以做到这些并不意味着我应该这样做。其中一个陷阱是测试。因为我对AutoMapper的调用最终会命中数据库以解决某些关系,所以我不能使用这些映射来进行单元测试,所以我必须为我的测试创建一组不同的映射。

您的存储库应预先加载必要的关系。人们建议让方法接受控制是否应使用Include加载某个关系的标志。在我的情况下,我认为当实体处于多方面以及检索单个实体时的所有关系时,我将始终加载多对一关系(例如,对于详细视图)。