DDD领域模型AutoMapper实现DTO(七)
DTO的应用场景:

定义产品类:
public class Product
{
public string ProductName { get; set; }
public decimal ProductUnitPrice { get; set; }
}
NueGet 添加AutoMapper映射组件。
定义ProductDTO对象:
public class ProductDTO
{
public string ProductName { get; set; }
public decimal ProductUnitPrice { get; set; }
}
定义两个类:
public class Address
{
public string AddressState { get; set; }
public string AddressCity { get; set; }
public string AddressStreet { get; set; }
}
public class Customer
{
public string CustomerName { get; set; }
public string CustomerMobile { get; set; }
public Address CustomerAddress { get; set; }
}
多个对象的映射类:
public class CustomerDTO
{
public string Name { get; set; }
public string Mobile { get; set; }
public string State { get; set; }
public string City { get; set; }
public string Street { get; set; }
}
映射的代码:
public class Mapping
{
public static ProductDTO CreateProductMapping()
{
var map=Mapper.CreateMap<Product, ProductDTO>();
Product p = new Product
{
ProductName = "P1",
ProductUnitPrice = 100
}; var pdto = Mapper.Map<Product, ProductDTO>(p);
return pdto; } public static CustomerDTO CreateCustomerMapping()
{
//创建映射关系
var map = Mapper.CreateMap<Customer, CustomerDTO>();
map.ForMember(ppt => ppt.Name, p => p.MapFrom(s => s.CustomerName));
map.ForMember(ppt => ppt.Mobile, p => p.MapFrom(s => s.CustomerMobile));
map.ForMember(ppt => ppt.State, p => p.MapFrom(s => s.CustomerAddress.AddressState));
map.ForMember(ppt => ppt.City, p => p.MapFrom(s => s.CustomerAddress.AddressCity));
map.ForMember(ppt => ppt.Street, p => p.MapFrom(s => s.CustomerAddress.AddressStreet)); Customer customer = new Customer
{
CustomerName = "sun",
CustomerMobile = "135933",
CustomerAddress =
new Address
{
AddressState = "山西",
AddressCity = "孝义",
AddressStreet = "三贤路"
}
};
var customerdto = Mapper.Map<Customer, CustomerDTO>(customer);
return customerdto;
}
//简单
public static CustomerDTO CreateCustomerMapppingNew()
{
var map = Mapper.CreateMap<Customer, CustomerDTO>();
map.ConstructProjectionUsing(s => new CustomerDTO
{
Name = s.CustomerName,
Mobile = s.CustomerMobile,
State = s.CustomerAddress.AddressState,
City = s.CustomerAddress.AddressCity,
Street = s.CustomerAddress.AddressStreet
});
Customer customer = new Customer
{
CustomerName = "sun",
CustomerMobile = "13458629365",
CustomerAddress =
new Address
{
AddressState = "山西",
AddressCity = "孝义",
AddressStreet = "三贤路"
}
};
var customerdto = Mapper.Map<Customer, CustomerDTO>(customer);
return customerdto;
} }
在上下文接口中(IRepositoryContext)中定义DTO的支持:
//添加DTO对象
void RegisterCreateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
where TAggreateRoot :
class, IAggreateRoot; void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot :
class, IAggreateRoot;
void RegisterUpdateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto) where TAggreateRoot :
class, IAggreateRoot;
仓储接口的调整:
void Create<TDTO>(TDTO tdto); TDTO GetByID<TDTO>(Guid id); List<TDTO> GetByCondition<TDTO>(Expression<Func<TAggreateRoot, bool>> condition); void Update<TDTO>(TDTO tdto); void Remove<TDTO>(TDTO tdto);
上下文DTO定义:(让EF上下文实现)
public abstract void RegisterCreateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
where TAggreateRoot : class, IAggreateRoot; public abstract void RegisterUpdateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
where TAggreateRoot : class, IAggreateRoot; public abstract void RegisterRemoveDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
where TAggreateRoot : class, IAggreateRoot;
EF上下文中实现:
public override void RegisterCreateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
{ if (processdto != null)
processdto(tdto);
var aggreateroot = Mapper.Map<TDTO, TAggreateRoot>(tdto);
RegisterCreate(aggreateroot); } public override void RegisterUpdateDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
{
if (processdto != null)
processdto(tdto);
var aggreateroot = Mapper.Map<TDTO, TAggreateRoot>(tdto);
RegisterUpdate(aggreateroot);
} public override void RegisterRemoveDTO<TDTO, TAggreateRoot>(TDTO tdto, Action<TDTO> processdto)
{
if (processdto != null)
processdto(tdto);
var aggreateroot = Mapper.Map<TDTO, TAggreateRoot>(tdto);
RegisterUpdate(aggreateroot);
}
EFRepository EF 仓储中的实现:
public void Create<TDTO>(TDTO tdto)
{
base.RegisterCreateDTO<TDTO, TAggreateRoot>(tdto, null);
} public List<TDTO> GetByCondition<TDTO>(Expression<Func<TAggreateRoot, bool>> condition)
{
//找到聚合根
var aggreatroots = orderdbcontext.Set<TAggreateRoot>().Where(condition).ToList();
//转黄成TDTO列表
var tdtos = new List<TDTO>();
if (aggreatroots.Count > 0)
{
foreach (var aggreateroot in aggreatroots)
{
var tdto = Mapper.Map<TAggreateRoot, TDTO>(aggreateroot);
tdtos.Add(tdto);
}
}
return tdtos;
} public TDTO GetByID<TDTO>(Guid id)
{
//得到聚合根
var aggreateroot = orderdbcontext.Set<TAggreateRoot>().Where(p => p.Id == id).SingleOrDefault();
//进行类型转换
var tdto = Mapper.Map<TAggreateRoot, TDTO>(aggreateroot);
//返回对象
return tdto;
} public void Remove<TDTO>(TDTO dto)
{
RegisterRemoveDTO<TDTO, TAggreateRoot>(dto, null);
} public void Update<TDTO>(TDTO dto)
{
RegisterUpdateDTO<TDTO, TAggreateRoot>(dto, null);
}
定义产品DTO类:
public class ProductDTO
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Color { get; set; }
public string Size { get; set; }
public int Amount { get; set; }
public decimal UnitPrice { get; set; }
public string PCategoryName { get; set; }
public string PDescription { get; set; }
}
在ProductCategory中实现构造函数:
public ProductCategory()
{ }
在Product中实现DTO:
public Product(IRepository<Product> irepository)
{
this.irepository = irepository;
//完成映射的创建
ProductMapping();
} //在调用构造函数的时候完成映射的创建
private void ProductMapping()
{
//从界面的DTO持久化领域对象
var mapin = Mapper.CreateMap<ProductDTO, Product>();
//指定属性的对应关系
mapin.ConstructProjectionUsing(p => new Product
{
ProductName = p.Name,
Size = p.Size,
Color = p.Color,
Count = p.Amount,
UnitPrice = p.UnitPrice,
ProductCategory = new ProductCategory
{
Id = Guid.NewGuid(),
CategoryName = p.PCategoryName,
Description = p.PDescription
}
});
//返回界面的东西
var mapout = Mapper.CreateMap<Product, ProductDTO>();
mapout.ConstructProjectionUsing(p => new ProductDTO
{
Name = p.ProductName,
Size = p.Size,
Color = p.Color,
UnitPrice = p.UnitPrice,
PCategoryName = p.ProductCategory.CategoryName,
PDescription = p.ProductCategory.Description,
Amount = p.Count
});
}
得到产品DTO 的方法:
/// <summary>
/// 得到产品DTO
/// </summary>
/// <param name="productname"></param>
/// <returns></returns>
public Product GetProducyByName(string productname)
{
return irepository.GetByCondition(p => p.ProductName == productname)
.FirstOrDefault();
}
通过DTO 创建Product:
/// <summary>
/// 通过DTOCreate
/// </summary>
/// <param name="productdto"></param>
public void CreateProduct(ProductDTO productdto)
{
productdto.Id = Guid.NewGuid();
irepository.Create(productdto);
}
服务 DTO 的创建:
/// <summary>
/// 服务DTO的创建
/// </summary>
/// <param name="productdto"></param>
public void Createproduct(ProductDTO productdto)
{
product.CreateProduct(productdto);
context.Commit();
}
/// <summary>
/// DTO的查询
/// </summary>
/// <param name="productname"></param>
/// <returns></returns>
public ProductDTO GetProductDTOByName(string productname)
{
return product.GetProductDTOByName(productname);
}
通过DTO创建测试:
[TestMethod]
public void CreateProduct()
{
//Product product = new Product(new ProductRepository());
ProductAppService product = new ProductAppService();
//product.CreateProduct("P1", "Red", "Small", 100, 55, "C1", "T恤类产品");
//product.CreateProduct("P2", "Green", "Big", 200, 40, "C2", "运动类产品");
ProductDTO productdto = new ProductDTO();
productdto.Name = "P3";
productdto.Color = "Blue";
productdto.Size = "Middle";
productdto.Amount = 5000;
productdto.UnitPrice = 10;
productdto.PCategoryName = "C3";
productdto.PDescription = "正装";
product.Createproduct(productdto);
context.Commit();
Assert.IsNotNull(product.GetProductByName("P3")); } [TestMethod]
public void GetproductDTOByName()
{
ProductAppService productappservice =
new ProductAppService();
var productdto = productappservice.GetProductDTOByName("P3");
Assert.AreEqual("P3", productdto.Name);
Assert.AreEqual("C3", productdto.PCategoryName);
}
DDD领域模型AutoMapper实现DTO(七)的更多相关文章
- 使用AutoMapper实现Dto和Model之间自由转换
应用场景:一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转 ...
- 自制AutoMapper实现DTO到持久层Entity的转换
自制AutoMapper实现DTO到持久层Entity的转换 项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有: java:dozer .n ...
- DDD领域模型和充血对象
DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...
- 简单使用AutoMapper实现DTO转换
DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...
- AutoMapper完成Dto与Model的转换
在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换. 例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.相反,当用户请求数 ...
- 使用AutoMapper实现Dto和Model的自由转换
AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...
- 使用AutoMapper实现Dto和Model的自由转换(上)
在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求 ...
- DDD领域模型查询方法实现(八)
在DDD.Domain工程文件夹Repository下创建RequestPage类: public class RequestPage { public RequestPage(int pagesiz ...
- 使用AutoMapper实现Dto和Model的自由转换(下)
书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...
随机推荐
- CM记录-集群主机存储情况
- JAVA记录-消息队列介绍
1.JMS概述 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消 ...
- oracle job入门【原】
oracle job入门 准备工作 先做一张学生表Table 表STUDENT create table STUDENT ( id INTEGER, name ), age INTEGER, crt_ ...
- [转]Maven与nexus
开始在使用Maven时,总是会听到nexus这个词,一会儿maven,一会儿nexus,当时很是困惑,nexus是什么呢,为什么它总是和maven一起被提到呢? 我们一步一步来了解吧. 一.了解Mav ...
- C#自绘蒙版控件,带延时隐藏显示,拷贝底图功能
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
- Docker入门02——Dockerfile详解
基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # Thi ...
- Linux查找文件、文件夹
https://www.jianshu.com/p/f3a46e5c96ba 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -na ...
- move_base
1>准备导航所需要的包. a.ros-indigo-gampping :我们不需要修改包内的东西,所以直接安装可执行文件就好了. sudo apt-get install ros-indigo- ...
- Linux用户组相关指令
⒈增加用户组 ①groupadd 用户组名 ⒉删除用户组 ①groupdel 用户组名 ⒊修改用户所在的用户组 ①usermod -g 用户组 用户名 ★用户和用户组的相关文件 ①/etc/passw ...
- GHOST分区丢失只剩C盘
很多人装系统时会经常会使用GHOST来恢复自己的系统,当WINDOWS系统出现意外时,再用GHOST的“From Image to 分区”来对系统进行恢复,这样就可以省去繁琐耗时的重新安装操作系统的工 ...