国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# DAO轉(zhuǎn)換為DTO工具類

這篇具有很好參考價(jià)值的文章主要介紹了C# DAO轉(zhuǎn)換為DTO工具類。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

思想

DAO(Data Access Object)數(shù)據(jù)訪問對(duì)象,是我們?cè)谧鼋Y(jié)構(gòu)化數(shù)據(jù)庫訪問的時(shí)候傳輸?shù)膶?duì)象,通過這個(gè)對(duì)象我們可以與數(shù)據(jù)庫中的表建立映射關(guān)系
DTO(Data Transfer Object)是我們?cè)谂c前端進(jìn)行數(shù)據(jù)交換時(shí)傳遞的對(duì)象


為什么需要設(shè)置這這兩種對(duì)象呢?

  1. 為了數(shù)據(jù)安全
    如果我們直接傳遞DAO的數(shù)據(jù),我們可能回把數(shù)據(jù)庫的底庫都扒光,比如一個(gè)用戶的數(shù)據(jù),包括用戶的Id、用戶的賬號(hào)、密碼等,我們直接傳遞到前端,用戶的密碼有可能被抓包軟件給獲取到,之后用戶賬號(hào)就可能回被盜用,而為了杜絕這種情況,我們從后端就直接把數(shù)據(jù)給換掉
  2. 除了DTO,甚至我們?cè)谀承┖蠖伺c數(shù)據(jù)庫進(jìn)行某些數(shù)據(jù)交換的時(shí)候也會(huì)設(shè)置一個(gè)中間模型,而不是直接使用DAO,因?yàn)槟承?shù)據(jù)庫表的字段過多,我們進(jìn)行業(yè)務(wù)的時(shí)候可能并用不到難么多的字段,所以回進(jìn)行一定的截?cái)?/li>

轉(zhuǎn)換思路

我們這里既然要轉(zhuǎn)換肯定是無論是基礎(chǔ)類型還是引用類型的屬性都可以轉(zhuǎn)換,所以我想到了利用反射
步驟:

  1. 獲取來來源對(duì)象的所有公開屬性
  2. 創(chuàng)建一個(gè)字典,字典的Key值為來源對(duì)象公開屬性名稱,字典的值為來源對(duì)象的公開屬性的值
  3. 創(chuàng)建出目標(biāo)類的對(duì)象,獲取到目標(biāo)類的所有公開屬性
  4. 根據(jù)目標(biāo)屬性名稱獲取到來源對(duì)象屬性的值,設(shè)置目標(biāo)屬性的值

代碼實(shí)現(xiàn)

來源類型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model.Entity
{
    public class User
    {
        public int UserId { get; set; }
        // QQ郵箱
        public string QQEmail { get; set; }
        // 昵稱
        public string Nickname { get; set; }
        // 密碼
        public string Password { get; set; }
        // 用戶狀態(tài) 0:表示online 1:表示離線 2:表示對(duì)戰(zhàn)中,-1:表示禁止登錄
        public int Status { get; set; }
        // 是否是管理員 0:不是 1:是
        public bool IsAdmin { get; set; }
        // 用戶的頭像
        public string AvatarUrl { get; set; }
        // 獲勝的場(chǎng)數(shù)
        public int WinNumber { get; set; }
        // 失敗的場(chǎng)數(shù)
        public int LoseNumber { get; set; }
        // 和棋的場(chǎng)數(shù)
        public int DrawNumber { get; set; }
        // 排名
        public int RankNumber { get; set; }
        // 創(chuàng)建時(shí)間
        public DateTime CreateTime { get; set; }
        // 修改時(shí)間
        public DateTime UpdateTime { get; set; }
    }
}


目標(biāo)類型


namespace gobangBack.DTO
{
    public record UserDTO
    {
        public int UserId { get; set; }
        // QQ郵箱
        public string QQEmail { get; set; }
        // 昵稱
        public string Nickname { get; set; }
        // 用戶狀態(tài) 0:表示online 1:表示離線 2:表示對(duì)戰(zhàn)中,-1:表示禁止登錄
        public int Status { get; set; }
        // 是否是管理員 0:不是 1:是
        public bool IsAdmin { get; set; }
        // 用戶的頭像
        public string AvatarUrl { get; set; }
        // 獲勝的場(chǎng)數(shù)
        public int WinNumber { get; set; }
        // 失敗的場(chǎng)數(shù)
        public int LoseNumber { get; set; }
        // 和棋的場(chǎng)數(shù)
        public int DrawNumber { get; set; }
        // 排名
        public int RankNumber { get; set; }
    }
}



using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Tool
{
    // 將參數(shù)Param轉(zhuǎn)換為Target類型
    public static  class TypeExtract
    {
        /// <summary>
        /// 將對(duì)應(yīng)的類型轉(zhuǎn)換為我們要轉(zhuǎn)換的類型
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target"></param>
        public static T TransformToTargetBased<E,T>(E source,Type target,bool ignoreNull=false) where T:new()
        {
            // 1.獲取到來源類的所有公開的屬性
            PropertyInfo[] sourceInfos = source.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            // 2.將其轉(zhuǎn)換為一個(gè)Key:屬性名,Value:屬性值的字典
            Dictionary<string, object> sourceDictionary = new Dictionary<string, object>();
            foreach (PropertyInfo sourceInfo in sourceInfos)
            {
                sourceDictionary[sourceInfo.Name] = sourceInfo.GetValue(source);
            }

            // 3.獲取到我們的目標(biāo)類型的所有的屬性
            T targetObj = new T();
            PropertyInfo[] targetInfos = targetObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            // 4.將來源對(duì)象的值轉(zhuǎn)載到目標(biāo)對(duì)象上
            foreach (PropertyInfo targetInfo in targetInfos) {
                // 5.判斷是否忽略空值
                if(ignoreNull)
                {
                    // 6.如果是忽略空值,則值為null的話就省略
                    if(sourceDictionary[targetInfo.Name] != null)
                    {
                        targetInfo.SetValue(targetObj, sourceDictionary[targetInfo.Name]);
                    }
                    continue;
                }
                else
                {
                     // 7.1.首先判斷目標(biāo)的類屬性名是否在我們的字典中有,如果有才賦值
                    if(sourceDictionary.ContainsKey(targetInfo.Name))
                    	targetInfo.SetValue(targetObj, sourceDictionary[targetInfo.Name]);
                }
            }
            return targetObj;
        }
    }
}


最后我再寫一個(gè)Api測(cè)試一下

[HttpGet]
public UserDTO Get() {
	User user = context.Users.Where(u => u.UserId == 1).Single();
	UserDTO usreDto = TypeExtract.TransformToTargetBased<User,UserDTO>(user,new UserDTO().GetType());
	return usreDto;
}

C# DAO轉(zhuǎn)換為DTO工具類


呼哈,成功,這個(gè)工具類我測(cè)試過,不僅僅是基本類型可以轉(zhuǎn)換,里面的屬性如果是引用類型一樣可以轉(zhuǎn)換,如果大家有更好的方法,希望大家分享出來,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-746189.html


到了這里,關(guān)于C# DAO轉(zhuǎn)換為DTO工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 后端開發(fā)基礎(chǔ)概念 Entity,DAO,DO,DTO,VO, Service,Controller

    Entity主要用于ORM(對(duì)象關(guān)系映射)框架中,如Hibernate、MyBatis等,以便將數(shù)據(jù)庫中的數(shù)據(jù)映射為對(duì)象,方便進(jìn)行業(yè)務(wù)操作。 Entity通常與數(shù)據(jù)庫表一一對(duì)應(yīng),代表 業(yè)務(wù)數(shù)據(jù) 的基本單元。 通常放在項(xiàng)目的model或entity包下。 ? DAO(數(shù)據(jù)訪問對(duì)象): DAO是連接業(yè)務(wù)邏輯和數(shù)據(jù)庫的橋

    2024年04月08日
    瀏覽(26)
  • Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和區(qū)別分析

    Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和區(qū)別分析

    @[TOC]Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和區(qū)別分析 前言 做開發(fā)項(xiàng)目時(shí),總會(huì)遇到這些包,理清他們的層次,非常有助于我們對(duì)于項(xiàng)目的理解和建立。 現(xiàn)階段CSDN上貌似沒有很系統(tǒng),很詳細(xì)的關(guān)于層級(jí)類的解釋。因此總結(jié)了一下自己的經(jīng)

    2024年02月07日
    瀏覽(25)
  • Spring Boot DTO 示例 - 實(shí)體到 DTO 的轉(zhuǎn)換

    在本教程中,我們將學(xué)習(xí)如何在 Spring Boot?應(yīng)用程序中 創(chuàng)建 DTO(數(shù)據(jù)傳輸對(duì)象)類,以及如何使用 ModelMapper 庫將實(shí)體轉(zhuǎn)換為 DTO,反之亦然。 數(shù)據(jù)傳輸對(duì)象設(shè)計(jì)模式是一種常用的設(shè)計(jì)模式。它基本上用于一次性將具有多個(gè)屬性的數(shù)據(jù)從客戶端傳遞到服務(wù)器,以避免多次調(diào)用遠(yuǎn)

    2024年02月06日
    瀏覽(20)
  • 【Jetpack】使用 Room 框架訪問 Android 平臺(tái) SQLite 數(shù)據(jù)庫 ( 導(dǎo)入依賴 | 定義 Entity 實(shí)體類 | 定義 Dao 數(shù)據(jù)庫訪問對(duì)象接口 | 定義數(shù)據(jù)庫實(shí)例類 )

    對(duì)于 Room 框架 來說 , 使用 Java 語言 開發(fā)和使用 Kotlin 語言 開發(fā) , 需要在 build.gradle 構(gòu)建腳本 中進(jìn)行不同的配置 , 主要有以下兩個(gè)配置不同 : 應(yīng)用的插件不同 ; 導(dǎo)入依賴庫方式不同 ; 應(yīng)用插件 應(yīng)用的插件區(qū)別 : 如果使用 Java 語言開發(fā) , 只需要導(dǎo)入 android 插件 ; 如果使用 Kotli

    2024年02月05日
    瀏覽(26)
  • 用棧的思想實(shí)現(xiàn)將一個(gè)十進(jìn)制數(shù)字轉(zhuǎn)換為八進(jìn)制--數(shù)據(jù)結(jié)構(gòu)

    用棧的思想實(shí)現(xiàn)將一個(gè)十進(jìn)制數(shù)字轉(zhuǎn)換為八進(jìn)制--數(shù)據(jù)結(jié)構(gòu)

    魔王的介紹:??????一名雙非本科大一小白。 魔王的目標(biāo):??努力趕上周圍卷王的腳步。 魔王的主頁:??????大魔王.?????? ?????大魔王與你分享:“并不是你喝了一瓶雪花,就有人愿意陪你勇闖天涯?!?學(xué)完棧的思想后,我們知道了棧只能從棧頂進(jìn)出,如果

    2023年04月24日
    瀏覽(38)
  • DTO,VO,PO的意義與他們之間的轉(zhuǎn)換

    DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象,這個(gè)概念來源于J2EE的設(shè)計(jì)模式,原來的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象。再通俗一

    2024年02月11日
    瀏覽(20)
  • C#操作Access數(shù)據(jù)庫

    C#操作Access數(shù)據(jù)庫

    Access數(shù)據(jù)的優(yōu)點(diǎn): 1,存儲(chǔ)方式單一 Access管理的對(duì)象有表、查詢、窗體、報(bào)表、頁、宏和模塊,以上對(duì)象都存放在后綴為 .mdb 的數(shù)據(jù)庫文件中,便于用戶的操作和管理。 2,面向?qū)ο?3,界面友好,易操作 4,輕量級(jí),數(shù)據(jù)庫(.mdb)文件可以直接加載到C#項(xiàng)目文件里(個(gè)人認(rèn)為它最

    2024年02月04日
    瀏覽(20)
  • DTO、VO、BO、PO、DO理解等相關(guān)的轉(zhuǎn)換

    DTO、VO、BO、PO、DO理解等相關(guān)的轉(zhuǎn)換

    pojo(domain/entity)一般定義實(shí)體類,實(shí)體類又被分為VO、BO、 PO、 DTO、DO;通過各層POJO的使用,有助于提高代碼的可讀性和可維護(hù)性。 DO(Data Object):此對(duì)象與數(shù)據(jù)庫表結(jié)構(gòu)一一對(duì)應(yīng),通過 DAO 層向上傳輸數(shù)據(jù)源對(duì)象。 DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象,Service 或 Manager 向外傳輸?shù)膶?duì)

    2024年02月07日
    瀏覽(23)
  • C#實(shí)現(xiàn)對(duì)Access數(shù)據(jù)庫的通用操作

    C#實(shí)現(xiàn)對(duì)Access數(shù)據(jù)庫的通用操作

    ? ①實(shí)現(xiàn)創(chuàng)建Access數(shù)據(jù)庫; ? ②實(shí)現(xiàn)創(chuàng)建指定Access數(shù)據(jù)庫的表; ? ③實(shí)現(xiàn)給Access數(shù)據(jù)庫的指定表【插入、查詢、更新、刪除、分頁查詢】數(shù)據(jù); ? ④實(shí)現(xiàn)獲取Access數(shù)據(jù)庫中的所有表名稱及其表包含的所有列名稱 該項(xiàng)目的完整工程下載地址如下: Access數(shù)據(jù)庫操作項(xiàng)目的完整工程

    2024年02月08日
    瀏覽(35)
  • 使用JDBC訪問微軟Access數(shù)據(jù)庫實(shí)例

    使用JDBC訪問微軟Access數(shù)據(jù)庫實(shí)例

    之前有使用ODBC來訪問Access數(shù)據(jù)庫的,但不方便.?? 是否可以使用JDBC訪問, 網(wǎng)上的說法不一, 也很少有實(shí)例參考. //?? ??? ?access由于access并不是作為一項(xiàng)服務(wù)運(yùn)行,所以u(píng)rl的方法對(duì)他不適用。? ( 其實(shí)這個(gè)是不對(duì)的. ) //?? ??? ?https://zhuanlan.zhihu.com/p/441219492 //?? ??? ?Access

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包