在ASP.NET Core MVC 2.2 中使用AutoMapper

AutoMapper doc:http://docs.automapper.org/en/stable/index.html

使用vs 2017 创建一个新项目:Application.Web

使用nuget添加引用:AutoMapper.Extensions.Microsoft.DependencyInjection

依赖项右两个:

1、注册AutoMapper服务

在Startup.cs文件中,找到ConfigureServices方法,在方法的最后添加一行代码:

services.AddAutoMapper();

 添加完成后,如下图所示

2、映射配置文件

必须在项目中添加映射配置文件,以便AutoMapper能够正确的识别要映射的对象

映射配置类要继承Profile类。当程序第一次运行时,AutoMapper会查找从Profile类继承的类并加载配置文件

AutoMapper能够自动从源和目标映射相同的名称属性

3、添加映射文件类

映射文件类:

public class MappingProfiles : Profile
{
    public MappingProfiles()
    {
        CreateMap<Department, DepartmentDTO>().ReverseMap();
    }
}

源和目标类:

    //源
    public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Owner { get; set; }
        public string SecretProperty { get; set; }
    }

    //目标
    public class DepartmentDTO
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Owner { get; set; }
    }

4、添加Controller

在Controllers文件夹中添加一个MyMappingController类

namespace Application.Web.Controllers
{
    public class MyMappingController : Controller
    {
        private readonly IMapper _mapper;
        private readonly Department sampleDepartment;
        public MyMappingController(IMapper mapper)
        {
            _mapper = mapper;
            sampleDepartment = new Department
            {
                Name = "department1", Id = 1, Owner = "ABC", SecretProperty = "Very secret property"
            };
        }
        [HttpGet]
        public ActionResult<DepartmentDTO> Index()
        {
            return _mapper.Map<DepartmentDTO>(sampleDepartment);
        }
    }
}

5、运行项目看结果

运行项目,使用postman访问我们的项目,可以看到返回的json数据没有SecretProperty 属性的值,其他的数据都有值

6、深入使用

在上面的例子中,使用AutoMapper实现了简单的一对一的映射,但是AutoMapper也可用于对象扩展或从对象中包含对象的复杂情况。

下面我们将使用引入Person类和PersonDTO类,Person类中包含一个为Address的属性。而Address是一个类类型。在PersonDTO类中,只有一个City的属性。我们将使用AutoMapper实现从复杂对象到一个简单对象的映射。

实现类如下:

namespace Application.Web.Models
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public Address Address { get; set; }
    }
    public class Address
    {
        public string HouseNumber { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
    }
    public class PersonDTO
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public string City { get; set; }
    }
}

 7、修改MappingProfiles映射类

public class MappingProfiles : Profile
{
    public MappingProfiles()
    {
        CreateMap<Department, DepartmentDTO>().ReverseMap();
        CreateMap<Person, PersonDTO>()
            .ForMember(dest => dest.City, opts => opts.MapFrom(src => src.Address.City))
            .ReverseMap();
    }
}

8、在MyMappingController类中添加对Person的映射方法,修改后代码如下:

namespace Application.Web.Controllers
{
    public class MyMappingController : Controller
    {
        private readonly IMapper _mapper;
        private readonly Department sampleDepartment;
        private readonly Person samplePerson;
        public MyMappingController(IMapper mapper)
        {
            _mapper = mapper;
            sampleDepartment = new Department
            {
                Name = "department1", Id = 1, Owner = "ABC", SecretProperty = "Very secret property"
            };
            samplePerson = new Person()
            {
                FirstName = "John",
                LastName = "Doe",
                Age = 30,
                Sex = "Male",
                Address = new Address()
                {
                    City = "New York City",
                    HouseNumber = "10",
                    State = "NY",
                    ZipCode = "999999"
                }
            };
        }
        [HttpGet]
        public ActionResult<DepartmentDTO> Index()
        {
            return _mapper.Map<DepartmentDTO>(sampleDepartment);
        }
        public ActionResult<PersonDTO> GetPerson()
        {
            return _mapper.Map<PersonDTO>(samplePerson);
        }
    }
}

9、运行项目看结果

通过结果可以看到,City属性成功的使用了Address属性内的City属性值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值