从零开始的.NET项目(二)仓储模式与配置AutoMapper
目标框架:.net6.0
操作系统:mac os
编译器:Rider
内容:创建第一个Controller,使用仓储(Respository)模式实现,并使用AutoMapper进行数据对象关系映射
非常简单的实现,Automapper也只介绍了最基础也最常用的 其他用法后续再补,目的就是稳准狠🤪
(一)仓储层
IxxxRepository
创建IxxxRepository.cs
接口类,定义对数据操作的契约。
namespace xxx;
public interface IxxxRepository
{
IEnumerable<YourModel> getData();
YourModel getDataById(Guid id);
}
xxxRepository
创建xxxRepository.cs
类
namespace xxx;
public class xxxRepository : IxxxRepository
{
private readonly AppDBContext _context;
public xxxRepository(AppDBContext context)
{
_context = context;
}
public IEnumerable<YourModel> getData()
{
return _context.YourModels;
}
public YourModel getDataById(Guid id)
{
return _context.YourModels.FirstOrDefault();
}
}
(二)AutoMapper
AutoMapper其实是先扫描程序集目录中所有的profile
文件,以此来创建映射关系,所以我们要先创建相关Dto类,来告诉AutoMapper如何映射。
Dto
public class YourModel
{
public string Id { get; set; }
public string Name { get; set; }
public int Sum { get; set; }
}
数据库Model
public class YourModel
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
public int A { get; set; }
public int B { get; set; }
}
profile
AutoMapper优先会把同名的字段相互映射,但有些时候我们想要映射的字段数据类型不一致,或者想要多个字段处理后再返回。
比如上面的,数据库存储的Id
是Guid
类型,但想要返回的数据中,Id
为string
类型,Sum
字段为A + B
。具体实现如下
namespace xxx;
public class xxxProfile : Profile
{
public xxxProfile()
{
CreateMap<YourModel, xxxDto>()
.ForMember(dest => dest.Price,
opt => opt.MapFrom(src => src.A * B)))
.ForMember(dest => dest.DepartureCity,
opt => opt.MapFrom(src => src.Id.ToString()));
}
}
(三)注入服务
在Program.cs
添加服务,这里笔者添加的是瞬时(Transient)服务。
builder.Services.AddTransient<IxxxRepository, xxxRepository>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
(四)Controller
namespace xxx;
[Route("api/[controller]")]
[ApiController]
public class xxxController : ControllerBase
{
private IxxxRepository _xxxRepository;
private readonly IMapper _mapper;
public TouristRoutesController(IxxxRepository xxxRepository, IMapper mapper)
{
_xxxRepository = xxxRepository;
_mapper = mapper;
}
/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult GetData()
{
var data = _xxxRepository.getData();
var xxxDto = _mapper.Map<IEnumerable<YourDto>>(data);
if (xxxDto == null || xxxDto.Count() < 0)
{
return NotFound("无数据");
}
return Ok(dtoData);
}
/// <summary>
/// 通过id查询数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id:guid}")]
// api/touistroutes/{id}
public IActionResult GetDataById(Guid id)
{
var data = _xxxRepository.getDataById(id);
//使用mapper映射
var xxxDto = _mapper.Map<YourDto>(data);
if (xxxDto == null)
{
return NotFound("无数据");
}
return Ok(xxxDto);
}
}