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