做轴承生意的网站,wordpress有广告插件,室内设计专业就业方向,写手机版网站的静态页面配置 AutoMapper 关系映射 在上一节 ToDoController 控制器#xff0c;或 IToDoService 服务接口中#xff0c;方法的传参都是直接传的实体类。但在实际开发过程中#xff0c;这样是不允许的。标准且规范的做法是#xff0c;定义一个数据传输层#xff0c;即Dto层。 一.在…配置 AutoMapper 关系映射 在上一节 ToDoController 控制器或 IToDoService 服务接口中方法的传参都是直接传的实体类。但在实际开发过程中这样是不允许的。标准且规范的做法是定义一个数据传输层即Dto层。 一.在MyToDo.Api 项目中安装 Auto Mapper 二. 在MyToDo.Shared 项目中创建一个Dtos文件夹存放Dto文件 1. 创建 BaseDto 基类用于存放共用属性。 public class BaseDto{public int Id { get; set; }} 2. 创建待办事项 Dto类并继承自 BaseDto 基类 /// summary/// 待办事项数据实体/// /summarypublic class ToDoDto:BaseDto{public string Title { get; set; }public string Content { get; set; }public int Status { get; set; }} 3.由于我们的客户端是Wpf 项目各属性需要实现通知绑定 。所以 BaseDto类需要进行修改并且要继承自 INotifyPropertyChanged 接口。同时还要实现一个通知绑定的方法。 public class BaseDto:INotifyPropertyChanged{public int Id { get; set; }public event PropertyChangedEventHandler? PropertyChanged;/// summary/// CallerMemberName 是一个自动获取传入名称的属性/// /summary/// param namepropertyName/parampublic void OnPropertyChanged([CallerMemberName] string propertyName ){PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));}} 4.接着要需要再修改 ToDoDto 让它具备实现属性绑定通知功能。 /// summary/// 待办事项数据实体/// /summarypublic class ToDoDto:BaseDto{private string title;private string content;private int status;public string Title {get { return title; }set { title value; OnPropertyChanged(); }}public string Content {get { return content; }set { content value; OnPropertyChanged(); }}public int Status {get { return status; }set { status value; OnPropertyChanged(); }}} 三.把实体类ToDo和定义的数据传输类ToDoDto 进行关系映射 1.在 MyToDo.Api 项目中创建一个 Extensions 扩展文件夹。再创建一个 AutoMapperProFile 类并且继承自 MapperConfigurationExpression该类用于配置所有实体类和数据传输类的映射关系。 public class AutoMapperProFile:MapperConfigurationExpression{public AutoMapperProFile(){/// 实体类和数据传输类进行映射CreateMapToDo, ToDoDto().ReverseMap();}}
ReverseMap 表示两者之间可以互相进行转换。 四.修改 ToDoController 控制器传参和IToDoService 服务传参 1. IToDoService接口类传入的ToDo实体改成ToDoDto public interface IToDoService:IBaseServiceToDoDto{} 2.ToDoService 服务实现类所有传入参数是ToDo实体需全部换成ToDoDto。并且需要在构造函数中注入 IMapper 接口。 /// summary/// 待办事项的实现/// /summarypublic class ToDoService : IToDoService{private readonly IUnitOfWork work;private readonly IMapper mapper;public ToDoService(IUnitOfWork work,IMapper mapper){this.work work;this.mapper mapper;}public async TaskApiResponse AddAsync(ToDoDto model){try{var doto mapper.MapToDo(model);//进行数据映射转换await work.GetRepositoryToDo().InsertAsync(doto);if (await work.SaveChangesAsync() 0) //保存成功{return new ApiResponse(true, model); //返回true并把添加的实体返回}return new ApiResponse(添加数据失败);}catch (Exception ex){return new ApiResponse(ex.Message);}}public async TaskApiResponse DeleteAsync(int id){try{var repository work.GetRepositoryToDo();//获取仓储//删除之前先进行查询var todo await repository.GetFirstOrDefaultAsync(predicate:xx.Id.Equals(id));repository.Delete(todo);if (await work.SaveChangesAsync() 0) //删除成功{return new ApiResponse(true, 删除成功); }return new ApiResponse(删除数据失败);}catch (Exception ex){return new ApiResponse(ex.Message);}}public async TaskApiResponse GetAllAsync(){try{var todos await work.GetRepositoryToDo().GetAllAsync();return new ApiResponse(true, todos); //返回true并返回所有数据}catch (Exception ex){return new ApiResponse(ex.Message);}}public async TaskApiResponse GetSingleAsync(int id){try{var todo await work.GetRepositoryToDo().GetFirstOrDefaultAsync(predicate: x x.Id.Equals(id));return new ApiResponse(true, todo); //把找到的数据返回}catch (Exception ex){return new ApiResponse(ex.Message);}}public async TaskApiResponse UpdateAsync(ToDoDto model){try{var dbdoto mapper.MapToDo(model);var repository work.GetRepositoryToDo();//获取仓储//更新之前先拿到要更新的数据var todo await repository.GetFirstOrDefaultAsync(predicate: x x.Id.Equals(dbdoto.Id));todo.Title dbdoto.Title;todo.Content dbdoto.Content;todo.Status dbdoto.Status;todo.UpdateDate DateTime.Now;repository.Update(todo);if (await work.SaveChangesAsync() 0) //更新成功{return new ApiResponse(true, 更新成功);}return new ApiResponse(更新数据失败);}catch (Exception ex){return new ApiResponse(ex.Message);}}} IMapper 接口里的 Map 方法用于 Dto和实体类之间的数据映射转换 3.把ToDoController 控制器传入的ToDo实体改成ToDoDto [ApiController][Route(api/[controller]/[action])]public class ToDoController:ControllerBase{private readonly IToDoService service;public ToDoController(IToDoService service){this.service service;}[HttpGet]public async TaskApiResponse Get(int id) await service.GetSingleAsync(id);[HttpGet]public async TaskApiResponse GetAll() await service.GetAllAsync();[HttpPost]public async TaskApiResponse Add([FromBody]ToDoDto model) await service.AddAsync(model);[HttpPost]public async TaskApiResponse Update([FromBody] ToDoDto model) await service.UpdateAsync(model);[HttpDelete]public async TaskApiResponse Delete(int id) await service.DeleteAsync(id);} 五.最后需要在Program.cs 中进行注册 AutoMapper 服务
//注入AutoMapper
builder.Services.AddSingleton(new MapperConfiguration(config
{config.AddProfile(new AutoMapperProFile());
}).CreateMapper()); 六.运行测试接口都正常证明配置AutoMapper 成功了