我应该在哪里放置automapper代码?
我在Asp.net mvc应用程序中使用Automapper。 我对automapper的用法有疑问
从很多示例代码中,我看到人们直接使用映射器Mapper.Map(source)
,我不确定这是不是很好,在我的观点中,我想将Mapper
代码包装好代理对象而不是让它直接与controller
public BankflowData CreateBankflowAdjustments(BankflowData addedBankFlow) { var bankflow = Mapper.Map(addedBankFlow); var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow); return Mapper.Map(newBankflow); }
在这个例子中,控制器对Class Bankflow
,它只知道dto BankflowData
。
我想知道这对于使用AutoMapper的应用程序是否是一个好习惯?
如果您的应用程序中有服务层,最好将automapper放在服务层中。 在任何情况下尝试使用扩展方法通过automapper映射您的对象,如下所示:
public static class Mapping { public static BankflowData CreateBankflowAdjustments(this BankflowData addedBankFlow) { var bankflow = Mapper.Map(addedBankFlow); var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow); return Mapper.Map(newBankflow); } }
它将使您的代码更具可读性并将您的问题分开。 拿这个来获取更多信息
对于上一个问题,我回答了ASP.NET MVC的服务层和存储库层,应该在哪里定义接口?
在我的回答中,我解释说:
[…]我有一个这样的典型结构:
- MyProject.Core
- MyProject.Domain
- MyProject.DependencyInjection
- MyProject.Infrastructure
- MyProject.Web
- MyProject.Tests
Infrastructure层包含有关日志记录,电子邮件和数据访问的信息。 它将包含我选择的ORM 。 这不是商业逻辑的东西,也不是UI的东西。 这是我完成任务的解决方案的铁路。 它在外层,但它只引用Core。
在我的例子中,基础设施层也包含Automapper。 核心定义了一个简单的接口(比如IAutoMapper
),基础设施中存在的一个简单对象实现了它,并且可以通过dependency injection将对象传递给UI层。
然而 Jimmy Bogard(Automapper的创建者)在AutoMapper 3.0,可移植类库和PlatformNotSupportedException中表示
[…] 如果你抱怨UI项目不应该直接引用这个库,因为一些愚蠢的虚假建筑师的理由(甚至引用某种臭的圆形蔬菜),我会开车到你的房子,打你傻。 脱下你的高马,开始富有成效。
根据我的理解,他意味着可以从UI层引用Automapper。 当他说“某种臭的圆形蔬菜”时,他当然指的是洋米建筑 ,吉米并不是它的忠实粉丝。