广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >配置ABP框架使用对象映射
  • 911
分享到

配置ABP框架使用对象映射

2024-04-02 19:04:59 911人浏览 薄情痞子
摘要

目录DTO和实体实体DTO麻烦的映射AutoMapper 集成iobjectMapper/ObjectMapper对象拓展DTO和实体 实体 实体是领域驱动设计(Domain Dri

DTO和实体

实体

实体是领域驱动设计(Domain Driven Design)中的概念,实体通常一一映射某些对象的固有属性,最常使用的是关系型数据库中的表。

abp 中,实体位于领域层中,实体类需要实现 IEntity<TKEy> 接口或继承 Entity<TKey> 基类,示例如下:

public class Book : Entity<Guid>
{
    public string Name { get; set; }

    public float Price { get; set; }
}

DTO

数据传输对象(Data Transfer Object),作为数据传输过程中的数据模型,用于在应用层和表示层之间传输数据。

在 ABP 中,DTO 位于应用服务层,即本系列文章示例源码中的 AbpBase.Application 项目

通常表示层或其它类型的客户端调用应用服务时,将 DTO 作为参数传递,它使用领域对象(实体)执行某些特定的业务逻辑,并将 DTO (跟传入的 DTO 不是同一个)返回到表示层中,因此表示层与领域层完全隔离。

DTO 类 可能会跟 实体类的字段/属性高度相似,为每个服务的每个方法创建 DTO 类可能会很枯燥且费时间。

ABP 的 DTO 类示例如下:

    public class ProductDto : EntityDto<Guid>
    {
        public string Name { get; set; }
        //...
    }

麻烦的映射

前面提到,领域层和应用服务层是要隔离的,例如以下伪代码:

class HomeController
{
    AddService _service;
    
    [HttpPost]
    public int AddEquip(EquipDto dto)
    {
        return _service.Add(dto).Id;
    }
}

class AddService
{
    DataContext _context;  
    EquipDto Add(EquipDto dto)
    {
        Equip equip = new Equip()
        {
          Name = dto.Name;  
        };
        _context.Equip.Add(equip);
        _context.SaveChange();
        dto.Id = equip.Id;
        return dto;
    }
}

class EquipDto
{
    int Id;
    string Name;
}

----------

class Equip
{
    int Id;
    string Name;
}

这样每次都需要手动为 DTO 类和 实体类手动对字段赋值映射,当一个实体有数十个字段时,写出的代码会很冗长,而且容易忽略了某些字段,最终导致了 Bug。

大家都知道, AutoMapper 正好可以解决这个问题。

AutoMapper 集成

ABP 的 Volo.Abp.AutoMapper 模块封装或集成了 AutoMapper,所以我们正好使用模块,为 ABP 应用定义对象映射。

关于 AutoMapper 的使用,如何配置 Profile 等,笔者已经单独写到 浅入 AutoMapper,请点击链接另外学习 AutoMapper 的使用。

我们可以在 AbpBase.Application 项目中,新建 一个 AbpBaseApplicationAutoMapperProfile.cs 文件,这个文件用于实现 Profile 以及定义映射。将服务领域的映射集中到这个文件中;或者新建一个 Profiles 文件夹,在其中存放一些 Profile 类。

其内容如下:

    public class AbpBaseApplicationAutoMapperProfile:Profile
    {
        public AbpBaseApplicationAutoMapperProfile()
        {
            //base.CreateMap<MyEntity,MyDto>();
        }
    }

定义完毕后,需要配置 AutoMapper 依赖注入,可在 AbpBaseApplicationModule 的 ConfigureServices 方法中,增加以下代码:

            Configure<AbpAutoMapperOptions>(options =>
            {
                // 以模块为单位注册映射
                options.AddMaps<AbpBaseApplicationModule>();
                //// 以单个 Profiel 为单位注册映射
                //options.AddProfile<AbpBaseApplicationAutoMapperProfile>();
            });

在 Debug 阶段,我们担心项目改动代码时,新增的字段忘记了加入到映射配置中,或者其它情况,在 AutoMapper 中,我们可以使用 configuration.AssertConfigurationIsValid(); 来检查映射;在 ABP 中则可使用 validate: true 参数来开启检查。

            Configure<AbpAutoMapperOptions>(options =>
            {
                // 以模块为单位注册映射
                options.AddMaps<AbpBaseApplicationModule>(validate: true);
                //// 以单个 Profiel 为单位注册映射
                //options.AddProfile<AbpBaseApplicationAutoMapperProfile>(validate: true);
            });

IObjectMapper/ObjectMapper

在 AbpBase.Application 项目中,添加 Nuget 包,搜索 Volo.Abp.ObjectMapping 并下载相应的稳定版本。

IObjectMapper 有两个,一个是 AutoMapper 的接口,一个是 Volo.Abp.ObjectMapping 的 泛型接口。

AutoMapper 的 IObjectMapper 不好用,所以别用;用 Volo.Abp.ObjectMapping 的 IObjectMapper <接口>

ObjectMapper 是 AutoMapper 中的,我们可以直接在控制器等位置,使用 ObjectMapper 注入,然后通过 ObjectMapper 实例映射对象。

ObjectMapper 只有 .Map() 这个方法用得顺手。

        private readonly ObjectMapper<T1,T2> _mapper;
        public TestController(ObjectMapper<T1,T2> mapper)
        {
            _mapper = mapper;

            // ... 使用示例
            _ = mapper.Map<T1> ();
        }

也可以通过依赖注入使用 IObjectMapper 接口。

但是因为 ObjectMapper 是泛型类,每种类型的 DTO 都要注入一次的话,会很麻烦,因此这种方案也可以抛弃。

而 泛型的 IObjectMapper<TModule> 是一个抽象,我们使用 IObjectMapper<TModule> 做依赖注入的话,后续如果替换为别的对象映射框架,则不需要修改原有代码即可完成替代。而且 IObjectMapper<TModule> 比较舒服。

使用示例:

        private readonly IObjectMapper<AbpBaseApplicationModule> _mapper;
        public TestController(IObjectMapper<AbpBaseApplicationModule> mapper)
        {
            _mapper = mapper;

            // ... 使用示例
            _ = mapper.Map<...>();
        }

对象拓展

ABP框架提供了实体扩展系统允许你添加额外属性到已存在的对象 无需修改相关类。这句话是抄 ABP 官方文档的。

要支持对象拓展映射,则需要开启配置:

public class MyProfile : Profile
{
    public MyProfile()
    {
        CreateMap<User, UserDto>()
            .MapExtraProperties();
    }
}

时间有限,笔者这里只把官方文档的内容讲清楚,读者看完后,需要继续查阅官方文档,完整了解对象拓展。

ObjectExtensionManager 是一个拓展对象映射类,可以显式为类拓展一些额外的属性,这个类型在 Volo.Abp.ObjectMapping 中定义。

ObjectExtensionManager 是一个类型,但是我们不能直接 new 它,或者使用依赖注入,只能通过 ObjectExtensionManager.Instance 这个属性获取新的类型。我们无需关心它是用了啥设计模式,还是因为缓存之类的原因这样设计。

ObjectExtensionManager 有两种属性,其说明如下:

  • AddOrUpdate :是定义对象额外属性或更新对象额外属性的主要方法;
  • AddOrUpdateProperty:快捷地定义单个拓展属性的方法;

AddOrUpdateProperty 用于定义单个属性,AddOrUpdate 是一个容器,可以包含多个 AddOrUpdateProperty 

AddOrUpdateProperty 示例代码如下:

ObjectExtensionManager.Instance
    .AddOrUpdateProperty<TestA, string>("Name");
// 为 TestA 类添加了一个 G 属性

AddOrUpdate 的示例代码如下:

ObjectExtensionManager.Instance
    .AddOrUpdate<TestA>(options =>
        {
            options.AddOrUpdateProperty<string>("Name");
            options.AddOrUpdateProperty<bool>("Nice");
        }
    );

当然,我们还可以同时为多个类型同时定义一个额外的属性:

ObjectExtensionManager.Instance
    .AddOrUpdateProperty<string>(
        new[]
        {
            typeof(TestA),
            typeof(TestB),
            typeof(TestC)
        },
        "Name"
    );

如果需要定义多个属性,则可以使用 AddOrUpdate

            ObjectExtensionManager.Instance
                .AddOrUpdate(options =>
                {
                    options.AddOrUpdateProperty<string>("Name");
                }, new[]{
                    typeof(TestA),
                    typeof(TestB)
                    });

另外它还可以设置默认值、增加验证规则等,这些笔者就不再赘述,读者感兴趣可以点击链接进入官方文档查看。

https://docs.abp.io/zh-Hans/abp/latest/Object-Extensions#validation

到此这篇关于配置ABP框架使用对象映射的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 配置ABP框架使用对象映射

本文链接: https://www.lsjlt.com/news/144354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 配置ABP框架使用对象映射
    目录DTO和实体实体DTO麻烦的映射AutoMapper 集成IObjectMapper/ObjectMapper对象拓展DTO和实体 实体 实体是领域驱动设计(Domain Dri...
    99+
    2022-11-13
  • 如何配置ABP框架使用对象映射
    小编给大家分享一下如何配置ABP框架使用对象映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!DTO和实体实体实体是领域驱动设计(Domain Driven De...
    99+
    2023-06-29
  • 如何使用对象到对象映射AutoMapper
    本篇内容主要讲解“如何使用对象到对象映射AutoMapper”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用对象到对象映射AutoMapper”吧!入门A...
    99+
    2022-10-19
  • springboot自定义配置及自定义对象映射的全流程
    目录一、使用@Value注解获取(一个一个获取)1.1 使用方法1.2 举例说明二、自定义对象映射2.1 使用方法2.2 举例说明一、使用@Value注解获取(一个一个获取)1.1 ...
    99+
    2022-11-13
  • Hibernate如何使用hbm.xml配置映射关系
    这篇文章将为大家详细讲解有关Hibernate如何使用hbm.xml配置映射关系,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在使用hibernate时,经常需要配置与类对应的hbm.xml文件,并在其中...
    99+
    2023-05-30
    hibernate
  • Mybatis-plus框架使用配置
    Mybatis-plus框架使用配置 MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。使得我们可以可以在 My...
    99+
    2023-09-08
    java spring boot mybatis
  • Express框架reqres对象使用详解
    目录IncomingMessageServerResponse请求对象 req响应对象设置状态码如何来快速测试这些属性和方法呢?下面给出一些示例代码目录结构安装依赖小结Express...
    99+
    2023-03-24
    Express框架req res对象 Express req res
  • Express框架view对象如何使用
    本篇内容主要讲解“Express框架view对象如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Express框架view对象如何使用”吧!Expess View 从指定渲染引擎开始以 m...
    99+
    2023-07-05
  • SpringBoot使用Mybatis&Mybatis-plus文件映射配置方法
    简介: Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司用Mybatis-plus;自己新建了一...
    99+
    2022-11-12
  • Express框架req res对象如何使用
    这篇文章主要讲解了“Express框架req res对象如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Express框架req res对象如何使用”吧!Expre...
    99+
    2023-07-05
  • 使用SpringBoot设置虚拟路径映射绝对路径
    目录SpringBoot 设置虚拟路径映射绝对路径下面我们就来代码实现下springboot打war包图片的虚拟路径映射在html图片的路径如图然后要映射到阿里云Linux服务器上路...
    99+
    2022-11-12
  • 一文解析Express框架view对象使用
    目录Expess View 从指定渲染引擎开始安装依赖从 res.render 函数开始View 的实现mustache 的render 方法的实现一个案例切图案例在 express...
    99+
    2023-03-10
    Express框架view对象 Express view
  • 如何在 Django 中使用 ASP 框架对象?
    Django 是一个非常流行的 Python Web 框架,它提供了许多功能和工具来帮助开发人员快速构建 Web 应用程序。但是,有时候我们需要在 Django 中使用 ASP 框架对象,以便更好地管理我们的 Web 应用程序。在本篇文章中...
    99+
    2023-11-11
    框架 对象 django
  • 如何在Java框架中使用Unix对象?
    Java是一种使用广泛的编程语言,拥有强大的功能和丰富的开发库。在Java中,使用Unix对象可以为我们的开发带来便利。本文将介绍如何在Java框架中使用Unix对象,以及如何使用Unix对象来处理文件和目录。同时,我们还将提供一些示例代码...
    99+
    2023-11-09
    框架 unix 对象
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件详解分析
    目录Mybatis的Dao层实现传统开发方式代理开发方式MyBatis映射文件深入动态sql语句动态SQL之<if>动态SQL之<foreach>SQL片段抽...
    99+
    2022-11-12
  • Express框架Router、Route和Layer对象如何使用
    今天小编给大家分享一下Express框架Router、Route和Layer对象如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-07-05
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件的示例分析
    Java Mybatis框架Dao层的实现与映射文件以及核心配置文件的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Mybatis的Dao层实现传统开发...
    99+
    2023-06-25
  • Express框架Router Route Layer对象使用示例详解
    目录引言LayerRouteRouter方法统计两个 stack取出 stack 中 layer从 Router 到 layer 的路径Router.route 方法中的 dispa...
    99+
    2023-03-24
    Express使用Router Route Layer Express 对象
  • Go语言如何在NumPy框架中使用对象?
    NumPy是Python中一个重要的科学计算工具包,它提供了一个强大的多维数组对象和用于处理数组的函数库。但是,NumPy并不是Python中唯一的科学计算工具,有时候我们需要使用其他语言来解决一些问题,比如Go语言。那么,Go语言如何在...
    99+
    2023-08-21
    对象 numpy 框架
  • Python - 【FastAPI】框架配置搭建基本使用
    一. 前言 之前在面试的时候面试官有提到过这个框架,但是个人在之前的项目中没有用到过,只是有听过,并没有实际的应用,因此,个人自己研究了一下,这是个新型的框架,使用起来相对挺简单。FastAPI是一个...
    99+
    2023-09-11
    python fastapi 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作