EF架构~AutoMapper对象映射工具简化了实体赋值的过程
AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而是单独根据具体场景,写一个新的类,这个类一般以DTO结尾,意思是说,它是网络上的数据传输用的,而你的DTO数据对象的赋值过程就成了一个问题,而为了减少赋值过程的代码量,AutoMapper就出来了,它可以实现实体对实体的赋值过程,或者叫“映射过程”。
我心中的项目应该是这样的,用户业务服务,产品业务服务,订单业务服务,这样服务都使 用单独的数据库,它们之间的通讯采用WCF进行实现,在获数据时会在WEB端添加缓存机制,以减少对WCF的调用,而在WCF的网络通讯中,数据类型一般 不会使用poco实体,因为它会有很多对当前业务无用的字段,我们会为具体业务建立具体的DTO对象,而entity实体与DTO实体之间的赋值过程我们 可以用AutoMapper来实现。
AutoMapper在程序中的体现:
DTO实体
[DataContract] public class ProductDTO { [DataMember] public int ProductID { get; set; } [DataMember] public string ProductName { get; set; } [DataMember] public System.DateTime CreateDate { get; set; } [DataMember] public int SaleCount { get; set; } [DataMember] public Nullable<int> ClickCount { get; set; } [DataMember] public string Info { get; set; } [DataMember] public int UserID { get; set; } [DataMember] public decimal SalePrice { get; set; } [DataMember] public int Discount { get; set; } }
POCO实体:
public partial class Product { public Product() { this.ProductDetail = new HashSet<ProductDetail>(); } public int ProductID { get; set; } public string ProductName { get; set; } public System.DateTime CreateDate { get; set; } public int SaleCount { get; set; } public Nullable<int> ClickCount { get; set; } public string Info { get; set; } public int UserID { get; set; } public decimal SalePrice { get; set; } public int Discount { get; set; } public System.DateTime UpdateDate { get; set; } public virtual User_Info User_Info { get; set; } public virtual ICollection<ProductDetail> ProductDetail { get; set; } }
下面使用AutoMapper实现对象两个实体的赋值,这是WCF服务中的代码片断:
public class ProductService : ServiceBase, IProductService { //通过ServiceLocator从IoC容器中获得对象 IProductRepository productRepository = ServiceLocator.Instance.GetService<IProductRepository>(); #region IProductService 成员 public ProductDTO CreateProduct(ProductDTO productDTO) { Mapper.CreateMap<ProductDTO, Product>(); Product product = Mapper.Map<ProductDTO, Product>(productDTO); productRepository.AddProduct(product); return productDTO; } public List<ProductDTO> GetProduct() { Mapper.CreateMap<Product, ProductDTO>(); List<ProductDTO> arr = new List<ProductDTO>(); productRepository.GetProduct().ForEach(i => { arr.Add(Mapper.Map<Product, ProductDTO>(i)); }); return arr; } public ProductDTO ModifyProduct(ProductDTO productDTO) { Mapper.CreateMap<ProductDTO, Product>(); Product product = Mapper.Map<ProductDTO, Product>(productDTO); productRepository.ModifyProduct(product); return productDTO; } #endregion }
怎么样,这种方式的对象赋值很爽吧,呵呵。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了