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.在这个系列的最后 ...
随机推荐
- synchronized的一些记录
1.方法内的私有变量,不存在线程安全问题.非线程安全问题存在于实例变量(全局变量)中 2.在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用) 3.synchroni ...
- PHP 进行支付宝开发中return_url和notify_url的区别分析
在支付宝处理业务中return_url,notify_url是返回些什么状态呢,我们要根据它来做一些处理就必须了解return_url,notify_url的区别,下面我就来给大家介绍; 一.问题描述 ...
- python学习笔记8--面向对象--属性和方法详解
属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...
- elementUI 表格设置表头样式
eader-row-class-name 表头行的 className 的回调方法,也可以使用字符串为所有表头行设置一个固定的 className. Function({row, rowIndex}) ...
- webuploader 百度上传,一个页面多个上传按钮
需求:列表里每条数据需加文件上传 html: <div> <ul class="SR_wrap_pic"></ul> <button ty ...
- Linux - iptable 限制 IP 访问端口
iptable 设置iptables 限制特定IP 访问: -A INPUT -s 172.16.2.20 -p tcp -j ACCEPT-A INPUT -s -p tcp -j ACCEPT 设 ...
- JavaScript之创建动态脚本
//option= {type,src,text,isCreateScriptBySrc} function createDynamicScript(option){ var script = doc ...
- Java SE之浅谈JDK SDK JRE
JDK(Java Development Kit): 1.定义:编写Java程序的程序员使用的软件开发工具包,又被称为Java SDK (Java Software Development Kit ...
- Java SE之字符串常量池
Reference Document: 什么是字符串常量池? http://www.importnew.com/10756.html[Recommend] Java常量池理解与总结 http: ...
- zabbix 在图形中显示网络设备的接口描述
zabbix原始模板没有提供来显示网络设备接口的描述,我们通常看到的图形显示是下面这样的: zabbix 3之后图形显示变化蛮大的,但我们乍一看,并不知道这个ethernet0/1是什么接口,网络设备 ...