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(七)的更多相关文章

  1. 使用AutoMapper实现Dto和Model之间自由转换

    应用场景:一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转 ...

  2. 自制AutoMapper实现DTO到持久层Entity的转换

    自制AutoMapper实现DTO到持久层Entity的转换 项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有: java:dozer .n ...

  3. DDD领域模型和充血对象

    DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  4. 简单使用AutoMapper实现DTO转换

    DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...

  5. AutoMapper完成Dto与Model的转换

    在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换. 例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.相反,当用户请求数 ...

  6. 使用AutoMapper实现Dto和Model的自由转换

    AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...

  7. 使用AutoMapper实现Dto和Model的自由转换(上)

    在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求 ...

  8. DDD领域模型查询方法实现(八)

    在DDD.Domain工程文件夹Repository下创建RequestPage类: public class RequestPage { public RequestPage(int pagesiz ...

  9. 使用AutoMapper实现Dto和Model的自由转换(下)

    书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...

随机推荐

  1. java查看本机hostName可代表的ip列表【转】

    java查看本机hostName可代表的ip列表 import java.net.InetAddress; public class ent { public static void main(Str ...

  2. bzoj千题计划297:bzoj3629: [JLOI2014]聪明的燕姿

    http://www.lydsy.com/JudgeOnline/problem.php?id=3629 约数和定理: 若n的标准分解式为 p1^k1 * p2^k2 …… 那么n的约数和= π (Σ ...

  3. Python基础(函数部分)-day04

    写在前面 上课第四天,打卡: 加勒比海盗今天上映:端午节公司发的粽子很有范! 一.函数的基本概念 - 函数是什么?  函数,就是一个'锤子',一个具有特定功能的'锤子',使用者可以在适当的时候使用这个 ...

  4. EntityFramework用法探索(八)事务处理

    使用 前文中描述的Retail示例 ,在Customer对象的Mapping中设置Name属性:我们构造一个有效的Customer对象,再构造一个无效的Name属性为空的对象. DomainModel ...

  5. gtid_executed和gtid_purged变量是如何初始化的

    一.官方释义 1.1.gtid_executed.gtid_purged https://dev.mysql.com/doc/refman/5.7/en/replication-options-gti ...

  6. Vue项目实践中的功能实现与要点

    本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...

  7. SpringBoot在IDEA中实现热部署

    gradle构建形式 添加依赖 compile("org.springframework.boot:spring-boot-devtools") 其他设置 步骤1 步骤2 按下 C ...

  8. Django学习手册 - ORM choice字段 如何在页面上显示值

    在module操作过程中使用choice字段: 核心: obj.get_字段名_display 定义module 数据结构: class msg(models.Model): choice = ( ( ...

  9. MySQL或MariaDB忘记root密码

    当我们忘记数据库密码时,我们可以通过如下来修改! 编辑配置文件(提前最好进行备份) 然后重启服务 systemctl restart mariadb 或者 systemctl restart mysq ...

  10. 没有备份怎么恢复被drop的表(利用undrop-for-innodb)

    介绍:     也许大家都难以理解,这么重要的数据为啥不备份(或者备份不可用)?而且还任性的drop table了.显然有备份是最好的,但是它们并不总是可用的.这种情况令人恐惧,但并非毫无希望.在许多 ...