如何使用 Dapper 中的非同步方法

来源:https://www.cnblogs.com/cdaniu/archive/2023/02/19/17134139.html
-Advertisement-
Play Games

Dapper 是一個 容易上手,輕量級,靈活高效,開源的 迷你 ORM,由 Stack Overflow 團隊的 Sam Saffron 出品,你可以利用 Dapper 簡化數據訪問並且支持高性能, 還有一點, Dapper 提供了很多非同步方法,本篇我們就來聊一聊如何在 ASP.NET Core 中 ...


Dapper 是一個 容易上手,輕量級,靈活高效,開源的 迷你 ORM,由 Stack Overflow 團隊的 Sam Saffron 出品,你可以利用 Dapper 簡化數據訪問並且支持高性能, 還有一點, Dapper 提供了很多非同步方法,本篇我們就來聊一聊如何在 ASP.NET Core 中使用 Dapper 的非同步方法。

安裝 Dapper

可以通過 Visual Studio 2019 IDE 中的 NuGet package manager 可視化界面安裝,也可以在 .NET CLI 命令行中輸入以下命令。


dotnet add package Install-Package Dapper

一旦 package 成功安裝到你的項目中,接下來就可以正式使用了。

使用非同步方法

Dapper提供了幾個非同步方法,可用於非同步的執行 CURD 操作,下麵是 Dapper 的非同步方法清單。

  • ExecuteAsync

  • QueryAsync

  • QueryFirstAsync

  • QueryFirstOrDefaultAsync

  • QuerySingleAsync

  • QuerySingleOrDefaultAsync

  • QueryMultipleAsync

為了演示目的,我就使用前兩個非同步方法進行演示。

QueryAsync 和 ExecuteAsync

創建一個 Author 實體類


    public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
    }

接下來創建一個 IAuthorRepository 介面


    public interface IAuthorRepository
    {
        Task GetByID(int id);
        public Task Insert(Author model);
    }

有了介面,就可以定義一個類實現這個介面


    public class AuthorRepository
    {
        private readonly IConfiguration _config;

        public AuthorRepository(IConfiguration config)
        {
            _config = config;
        }
        public async Task GetByID(int id)
        {
            using (IDbConnection conn = new SqlConnection(_config.GetConnectionString("IDGDbConnectionString")))
            {
                string query = "SELECT Id, FirstName, LastName,Address FROM Author WHERE Id = @id";
                conn.Open();
                var result = await conn.QueryAsync(
                query, new { Id = id });
                return result.FirstOrDefault();
            }
        }
        public async Task Insert(Author model)
        {
            return false;
        }
    }

值得註意的是上面我用了 QueryAsync 方法實現了對 SqlServer 的非同步查詢,接下來再填充一下 非同步方法 Insert。


public async Task Insert(Author model)
{
      int x = -1;
      using (var connection = new SqlConnection(_config.GetConnectionString("IDGDbConnectionString")))
      {
          await connection.OpenAsync();
          var sqlStatement = @"INSERT INTO Author (FirstName, LastName, Address)";
          x = await connection.ExecuteAsync(sqlStatement, model);
      }
      
      return x > 0;
}

可以看到 ExecuteAsync 方法接收兩個參數,一個是 sql,一個是 待插入或者更新 的數據。

對資料庫連接進行依賴註入

可以將連接資料庫的 ConnectionString 放到 appSettings.json 文件中,然後使用 IConfiguration 實例下的 GetConnectionString() 方法來獲取 ConenctionString。

接下來,使用依賴註入機制將 IConfiguration 實例註入到 AuthorRepository 中,如下代碼所示:


public class AuthorRepository : IAuthorRepository
{
    private readonly IConfiguration _config;
    public EmployeeRepository(IConfiguration config)
    {
        _config = config;
    }
    //Other methods
}

下麵的代碼片段展示瞭如何去創建 SqlConnection 實例。


    public IDbConnection DbConnection
    {
        get
        {
            return new SqlConnection(_config.GetConnectionString("IDGDbConnectionString"));
        }
    }

現在這個 DbConnection 屬性就可以替代之前 Insert 方法中使用的 SqlConnection 創建的資料庫連接,改造後的 Insert 方法如下。


public async Task Insert(Author model)
 {
      int x = -1;
      using (var connection = DbConnection)
      {
          await connection.OpenAsync();
          var sqlStatement = @"INSERT INTO Author (FirstName, LastName, Address)";
          x = await connection.ExecuteAsync(sqlStatement, model);
      }
      
      return x > 0;
 }

將 repository 添加到 IOC 容器中

為了後續的 依賴註入,這裡先把 repository 添加到 IOC 中。


    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient();
        //Other code
    }

在 Controller 中使用 repository

接下來通過依賴註入的方式將 IAuthorRepository 實例註入到 AuthorController 中,下麵的代碼片段展示瞭如何去實現。


[Route("api/[controller]")]
[ApiController]
public class AuthorController : ControllerBase
{
    private readonly IAuthorRepository _authorRepository;
    public AuthorController(IAuthorRepository authorRepository)
    {
        _authorRepository = authorRepository;
    }
  //Action methods
}

接下來看一下 Action 中如何通過 AuthorRepository 實例來獲取 Author 實例數據的。


[HttpGet]
[Route("{id}")]
public async Task> GetByID(int id)
{
    return await _authorRepository.GetByID(id);
}

這就


作者:一線碼農上海
鏈接:https://www.imooc.com/article/314630
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作 編程是個人愛好
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於在若依平臺中建立樹形結構無法使用按鈕編輯和新增的修改(若依前後端不分離) 1、在若依平臺上建立樹形結構實現類似於其部門管理的樣式並非簡單,從資料庫構建到後期的一些bug調整都十分麻煩。這裡簡要說一下如何修正按照正常樹表構建樹形結構後無法使用右側編輯和新增按鈕的問題。 2、首先,常見的報錯為:類T ...
  • 題目來源:https://www.acwing.com/problem/content/790/ 題目描述 給定一個長度為 n 的整數數列,請你計算數列中的逆序對的數量。 逆序對的定義如下:對於數列的第 i 個和第 j個元素,如果滿足 i<j且 a[i]>a[j],則其為一個逆序對;否則不是。 輸入 ...
  • 安裝 清除node緩存:sudo npm cache clean -f 安裝 n 執行: npm install n -g 註意:如果報錯如:code EACCES errno -13,表示你沒有許可權安裝,使用管理員身份安裝:sudo npm i n -g 查看n是否安裝成功:n -V 使用n管理n ...
  • 一.Timer Timer為threading中的一個類,用來指定的秒數後調用函數,我們來看下Timer類的構造參數。 interval:設置定時運行的時間 function:設置定時的事件 args:參數 kwargs:字典類型的參數 下麵我們看下具體的用法 1.無參的情況下 from threa ...
  • /** * 工具類的作用 * 處理各種情況下用戶的輸入,並且能夠按照程式員的要求,得到用戶的控制台輸入。 */ public class Utility { //靜態屬性 private static Scanner scanner = new Scanner(System.in); /** * 功 ...
  • #3.投票-1創建項目和子應用 創建項目 命令 $ python django-admin startproject mysite 目錄結構 mysite/ # 項目容器、可任意命名 manage.py # 命令行工具 mysite/ # 純 Python 包 # 你引用任何東西都要用到它 __in ...
  • 數的計數 題目描述 我們要求找出具有下列性質數的個數(包含輸入的自然數n ),先輸入一個自然數n (n≤1000),然後對此自然數按照如下方法進行處理: (1)、不作任何處理; (2)、在它的左邊加上一個自然數,但該自然數不能超過原數的一半; (3)、加上數後,繼續按此規則進行處理,直到不能再加自然 ...
  • 2023-02-18 一、尚好房項目的資料庫建表文件 建立一個“db_house.sql”文件,將下述代碼添加即可。 與idea連接的步驟: (1)與idea與資料庫連接,之後,新建一個資料庫,重命名 (2)選中剛剛的資料庫,右擊,點擊執行SQL語句 找到該db_house.sql文件的位置,導入即 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...