从零开始的.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优先会把同名的字段相互映射,但有些时候我们想要映射的字段数据类型不一致,或者想要多个字段处理后再返回。

比如上面的,数据库存储的IdGuid类型,但想要返回的数据中,Idstring类型,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);
    }
}
posted @ 2024-06-06 18:23  有了一个点子  阅读(8)  评论(0编辑  收藏  举报