说说AutoMapper那些事
2024-08-22 13:46:53
项目中用到了DTO与Model之间的转换,因为model项目比较多,所以需要使用工具或者代码来实现快速的转换。AutoMapper就是一个很好的基于约定的object-object mapper.映射器。
Map规则:
AutoMapper默认是根据实体的属性名称来一一对应映射,你也可以手动的设置Map规则。
接下来举个栗子:
一、默认属性Map (DTO => Model)
准备实体
namespace MapDemo
{
using System;
using System.Collections.Generic; public partial class Service
{
public Service()
{
this.ServiceDtl = new HashSet<ServiceDtl>();
} public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } public virtual ICollection<ServiceDtl> ServiceDtl { get; set; } }
}
namespace MapDemo
{
using System;
using System.Collections.Generic; public partial class ServiceDtl
{
public int DtlId { get; set; }
public string DtlName { get; set; }
public Nullable<int> Id { get; set; } public virtual Service Service { get; set; }
}
}
准备Model
namespace MapDemo.Model
{
class ServiceModel
{
public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } public virtual ICollection<ServiceDtl> ServiceDtl { get; set; } }
}
namespace MapDemo.Model
{
class ServiceDtlModel
{
public int DtlId { get; set; }
public string DtlName { get; set; }
public Nullable<int> Id { get; set; } public virtual Service Service { get; set; }
}
}
Mapper初始化:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Service, ServiceModel>();
});
二、单表Map
var serviceModel= Mapper.Map<ServiceModel>(service);
三、多表多层指定Map
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Service, ServiceModel>().ForMember(d => d.ServiceDtl, opt => opt.MapFrom(s => s.ServiceDtl));
cfg.CreateMap<ServiceDtl, ServiceDtlModel>();
}); var serviceModel= Mapper.Map<ServiceModel>(service);
这样service中就包含了ServiceDtl的项目,操作DB的时候进行反向Map,只需要操作主表,适用于多层表结构的操作,方便快捷,代码量少。
四、Model与Model之间Map
创建一个类似ServiceModel的模型CYService
namespace MapDemo.Model
{
class CYService
{ public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } }
}
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Service, CYService>();
});
var cyService = Mapper.Map<CYService>(newItem);
简单总结一下:
AutoMapper对于多表的层级操作十分方便,并且易于扩展。
但是项目中不建议直接使用Mapper.Map(),建议使用局部的mapEngine.Map()避免全局Map的影响。
具体参照官方解释:http://automapper.readthedocs.io/en/latest/index.html
最新文章
- CDH离线数据导入solr:利用MapReduceIndexerTool将json文件批量导入到solr
- Java深度历险(五)——Java泛型
- 给各位聚聚和大大介绍一个开源项目 Expression2Sql(转)
- 如何建立一个完整的游戏AI
- PHP魔术方法在框架中的应用
- c++ template函数的声明和实现需要在同一个文件中
- zw版【转发&#183;台湾nvp系列Delphi例程】HALCON ObjToInteger1-4
- OS开发拓展篇—应用之间的跳转和数据传
- Delphi 编写的Web Service
- NSFileHandle编写json数据格式
- readline与readlines不能同时使用
- 谈谈java的BlockingQueue
- GIF动态图制作
- Linux环境变量配置全攻略
- [转载]C# TimeSpan 计算时间差(时间间隔)
- php调用API支付接口 转至http://www.cnblogs.com/chaochao00o/p/6490463.html
- js使用中的小问题----textarea是否有value属性
- 使用Maven+ssm框架搭建一个web项目
- bootstrap基础学习小记(一)简介模板、全局样式
- 初探C++类模版学习笔记
热门文章
- 阿里企业邮箱smtp设置
- 【转载】C#中List集合SingleOrDefault和FirstOrDefault方法有何不同
- 浅谈javascript中的递归和闭包
- js 数组的深度拷贝 的四种实现方法
- Centos7 docker安装GitLab
- Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)
- SQL SERVER-Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)
- linux系统编程之信号(六)
- linux简单的命令
- vbs剪切Excel某一行