我在 Asp.net mvc 应用程序中使用 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);
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,控制器对 Class 一无所知Bankflow,它只知道 dto BankflowData。
我想知道这对于使用 AutoMapper 的应用程序是否是一个好习惯?
上一个问题,我回答了ASP.NET MVC with service layer and repository layer,接口应该在哪里定义?
在我的回答中,我解释说:
[...] 我有一个这样的典型结构:
- 我的项目核心
- 我的项目.域
- MyProject.DependencyInjection
- 我的项目.基础设施
- 我的项目.Web
- MyProject.Tests
在基础设施层包含有关记录,电子邮件和数据存取信息。它将包含我选择的ORM。它不是业务逻辑的东西,也不是 UI 的东西。这是我完成工作的解决方案的铁路。它位于外层,但仅引用核心。
就我而言,基础设施层还包含 Automapper。核心定义了一个简单的接口(假设IAutoMapper)和一个存在于基础设施中的简单对象实现它,并且该对象可以通过依赖注入传递到 UI 层。
但是Jimmy Bogard(Automapper 的创建者)在AutoMapper 3.0、Portable Class Libraries 和 PlatformNotSupportedException 中说
[...]如果你抱怨 UI 项目不应该直接引用这个库,因为一些愚蠢的人造建筑师的原因(甚至引用了某种发臭的圆形蔬菜),我会开车到你家并傻傻地扇你一巴掌。放下你的豪迈,开始变得富有成效。
据我了解,他的意思是可以从 UI 层引用 Automapper。当他说“某种发臭的圆形蔬菜”时,他当然指的是吉米不太喜欢的洋葱建筑。
小智 3
如果您的应用程序中有服务层,最好将自动映射器放在服务层中。在任何情况下,尝试使用扩展方法通过自动映射器映射您的对象,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它将使您的代码更具可读性并分离您的关注点。以此获取更多信息
| 归档时间: |
|
| 查看次数: |
6147 次 |
| 最近记录: |