2014-02-07 72 views
2

我在Asp.net mvc应用程序中使用Automapper。 我有一个问题关于automapper我应该在哪里放置automapper代码?

从大量的示例代码的使用,我看到人们直接在行动使用映射Mapper.Map<Target>(source),我不知道这是否是好的prctice,在我的观点,我会喜欢包裹Mapper码在代理对象,而不是让它在这个例子与controller直接

 public BankflowData CreateBankflowAdjustments(BankflowData addedBankFlow) 
     { 
     var bankflow = Mapper.Map<Bankflow>(addedBankFlow); 
     var newBankflow = Underlying.CreateBankFlowAdjustments(bankflow); 
     return Mapper.Map<BankflowData>(newBankflow); 
     } 

说话,控制器一无所知Bankflow类,都知道它是DTO BankflowData

我想知道这是否是使用AutoMapper的应用程序的良好实践?

回答

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获取更多信息

+0

这个例子看起来不错,所以你的想法是使用extend方法来封装'Mapper.Map'并且调用DTO.ToDomain(),是吗?你也同意映射代码应该放在服务层而不是控制层,对吗? – Sean

+0

是的,但是如果你有服务层,最好的地方是将它们放在那里,因为将DTO或ViewModel映射到域实体的最佳位置是服务层。尽管如果您的应用程序不够大,您可以将它们放入您的控制器中,但请尝试使用扩展方法来使代码清洁。 – Ehsan

3

对于前一个问题,我回答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层。

然而吉米·博加德(Automapper的作者)在AutoMapper 3.0, Portable Class Libraries and PlatformNotSupportedException

[...] 说,如果你抱怨UI项目不应该直接引用,因为一些愚蠢的人造architect-这个库(即使参考某种臭蔬菜),我会开车到你家,给你打气。放下你的骏马,开始提高生产力。

从我的理解中,他意味着可以从UI层引用Automapper。当他说“某种臭蔬菜”他当然是指Onion Architecture,吉米不是那么喜欢。

+0

感谢您的回答,是的,我同意您将非商业逻辑代码放入基础设施和包装器Automapper中,但是我的问题是Sould直接向域控制器公开域?或者由代理对象包装,只将DTO暴露给控制器?例如:我有一个服务对象返回域对象'Cashflow'这是一个很大的对象,意思是我有一个DTO对象CashflowDTO这是一个轻量级对象,服务对象只将域对象作为参数或结果 – Sean

+0

所以我有两个chice,1.将dto映射到控制器层的域对象(我不喜欢)2.用代理对象封装服务器并映射到那里,我更喜欢第二种选择,你的想法是什么? – Sean