ABP AutoMapper与自定义Mapping
对象映射
在工作中,需要将相似的对象映射到另一个对象,这样我们来看一个最繁琐的映射方式
例:
public class UserAppService : ApplicationService
{
private readonly IRepository<User> _userRepository;
public UserAppService(IRepository<User> userRepository)
{
_userRepository = userRepository;
}
public void CreateUser(CreateUserInput input)
{
var user = new User
{
Name = input.Name,
Surname = input.Surname,
EmailAddress = input.EmailAddress,
Password = input.Password
};
_userRepository.Insert(user);
}
}
通过 new 一个新的实体去赋值并保存数据,User 实体在现实的应用程序中会有更多的属性,这样的手动创建它会变得乏味且容易出错。当我们想要向 User 和 CreateUserInput 添加新属性时,我们还必须更改映射代码。
上个例子繁琐,我们做出改进
我们可以使用一个库来自动处理我们的映射。 AutoMapper是对象到对象映射的最佳库之一。ASP.NET Boilerplate 定义了一个IObjectMapper 接口来抽象它,然后使用Abp.AutoMapper 包中的 AutoMapper 实现这个接口。
注意:需要将Abp.AutoMapper NuGet 包安装到您的项目中:
public class UserAppService : ApplicationService
{
private readonly IRepository<User> _userRepository;
private readonly IObjectMapper _objectMapper;
public UserAppService(IRepository<User> userRepository, IObjectMapper objectMapper)
{
_userRepository = userRepository;
_objectMapper = objectMapper;
}
public void CreateUser(CreateUserInput input)
{
var user = _objectMapper.Map<User>(input);
_userRepository.Insert(user);
}
}
IObjectMapper 是一个简单的抽象,它具有将一个对象映射到另一个对象的 Map 方法。
Map 是一个简单的方法,它获取源对象并创建一个新的目标对象,其类型声明为通用参数(本示例中的 User)。Map 方法具有将对象映射到现有对象的重载 。假设我们已经有一个 User 实体并且想要使用一个对象更新它的属性:
public void UpdateUser(UpdateUserInput input)
{
var user = _userRepository.Get(input.Id);
_objectMapper.Map(input, user);
}
大多数时候,您可能只想直接(和传统地)映射类。在这种情况下,您可以使用AutoMap、AutoMapFrom和AutoMapTo 属性。例如,如果我们想将CreateUserInput类映射到上面示例中的User类,我们可以使用AutoMapTo属性,如下所示:
[AutoMapTo(typeof(User))]
public class CreateUserInput
{
public string Name { get; set; }
public string Surname { get; set; }
public string EmailAddress { get; set; }
public string Password { get; set; }
}
自定义映射
在某些情况下,简单映射可能不适合。例如,两个类的属性名称可能略有不同,或者您可能希望在映射过程中忽略某些属性。在这种情况下,您应该直接使用 AutoMapper 的 API 来定义映射。Abp.AutoMapper 包定义了一个 API 来使自定义映射更加模块化。
假设我们想在映射时忽略密码,并且用户的电子邮件属性名称略有不同。我们可以定义映射如下所示:
[DependsOn(typeof(AbpAutoMapperModule))]
public class MyModule : AbpModule
{
public override void PreInitialize()
{
Configuration.Modules.AbpAutoMapper().Configurators.Add(config =>
{
config.CreateMap<CreateUserInput, User>()
.ForMember(u => u.Password, options => options.Ignore())
.ForMember(u => u.Email, options => options.MapFrom(input => input.EmailAddress));
});
}
}
可以使用另一种变种类型:
[DependsOn(typeof(AbpAutoMapperModule))]
public class MyModule : AbpModule
{
public override void PreInitialize()
{
}
public override void Initialize()
{
var thisAssembly = typeof(MyModule ).GetAssembly();
IocManager.RegisterAssemblyByConvention(thisAssembly);
Configuration.Modules.AbpAutoMapper().Configurators.Add(
cfg => cfg.AddProfile<CustomDtoMapperProfile>()
);
}
}
public class CustomDtoMapperProfile : Profile
{
public CustomDtoMapperProfile()
{
CreateMap<CreateUserInput, User>()
.ForMember(u => u.Password, options => options.Ignore())
.ForMember(u => u.Email, options => options.MapFrom(input => input.EmailAddress));
}
}
ABP AutoMapper与自定义Mapping的更多相关文章
- 10.AutoMapper 之自定义值解析器(Custom Value Resolvers)
https://www.jianshu.com/p/3e7cf1d1f17d 自定义值解析器(Custom Value Resolvers) 虽然AutoMapper涵盖了相当多的目标成员映射方案,但 ...
- 09.AutoMapper 之自定义类型转换器(Custom Type Converters)
https://www.jianshu.com/p/47054d92db2a 自定义类型转换器(Custom Type Converters) 有时需要完全控制一种类型到另一种类型的转换.这一般发生在 ...
- ABP源码分析三十一:ABP.AutoMapper
这个模块封装了Automapper,使其更易于使用. 下图描述了改模块涉及的所有类之间的关系. AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttri ...
- Abp.AutoMapper扩展(1) --static class AutoMapExtensions
// 摘要: // Converts an object to another using AutoMapper library. Creates a new object ...
- AutoMapper之自定义解析
自定义解析 4.自定义解析 AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理.AutoM ...
- 自定义mapping与常见参数
PUT test { "mappings": { "dynamic": true, "properties": { "firstn ...
- AutoMapper搬运工之自定义映射
回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https:/ ...
- AutoMapper搬运工之自定义类型转换
前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...
- 说说ABP项目中的AutoMapper,Castle Windsor(痛并快乐着)
这篇博客要说的东西跟ABP,AutoMapper和Castle Windsor都有关系,而且也是我在项目中遇到的问题,最终解决了,现在的感受就是“痛并快乐着”. 首先,这篇博客不是讲什么新的知识点,而 ...
- ABP 源码分析汇总之 AutoMapper
AutoMapper 是一个对象映射工具, 安装时只需要安装 如下即可: 有关于它的介绍,参考官网:http://automapper.org/ AutoMapper使用比较简单,还是直奔主题,看一下 ...
随机推荐
- 监控告警之elastalert部署及配置全解
一.安装elastalert 1.环境 CentOS:7.4 Python:3.6.9 pip:19.3 elastalert:0.2.1 elk:7.3.2 2.配置Python3.6.9环境 安装 ...
- day05-离线留言和离线文件
多用户即时通讯系统05 4.编码实现04(拓展) 拓展功能: 实现离线留言,如果某个用户不在线 ,当登陆后,可以接收离线的消息 实现离线发文件,如果某个功能没有在线,当登录后,可以接收离线的文件 4. ...
- C++ STL 概述_严丝合缝的合作者们
1. 初识 STL 什么是STL? STL(Standard Template Library) 是C++以模板形式提供的一套标准库,提供了很多开发过程需要的通用功能模块.使用 STL ,可以让开发者 ...
- ERP 与 CRM 之间有什么联系?
ERP与CRM都涉及到客户的管理,在客户信息数据里很大一部分是重合的,可以共用的,即ERP里的客户信息可以为CRM所用,CRM的客户信息,亦可为ERP所用!在关系上可以理解为CRM就是ERP的最前端, ...
- Codeforces Round #442 (Div. 2) B. Nikita and string
题意:求最长可以分a b a为三部分子串,a b a可以为空 思路在代码里 1 #include<cstdio> 2 #include<iostream> 3 #include ...
- python中的多线程与多进程
线程概念: 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位. 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其 ...
- Linux执行jsp命令的时候报错:-bash: jps: command not found
前言:在zookeeper学习的时候,执行jsp命令查看zookpper运行状态的时候发现报错: -bash: jps: command not found 翻阅了一大批文章,不是东拼西凑,就是缺斤少 ...
- 【SSM】学习笔记(一)—— Spring入门
原视频:https://www.bilibili.com/video/BV1Fi4y1S7ix?p=1 P1~P42 目录 一.Spring 概述 1.1.Spring 家族 1.2.Spring 发 ...
- 使用DOS命令运行JAVA项目
使用DOS命令运行JAVA项目 找到生成项目的文件夹: 在地址前加上cmd+空格,进入命令窗口: 输入javac 类的名称.java,生成class文件: 输入java 类的名称: 运行成功:
- 第一章 计算机和C++简介
1.1 简介 C++是一种强大的计算机面向对象编程的程序设计语言,它是制造软件的一种编程语言,适合程序员和刚接触编程的技术人员.当今智能手机销量爆炸式增长给移动应用程序的开发带来了很多机会,而C++就 ...