Dapper 是一個 容易上手,輕量級,靈活高效,開源的 迷你 ORM
,由 Stack Overflow 團隊的 Sam Saffron 出品,你可以利用 Dapper 簡化資料訪問並且支援高效能, 還有一點, Dapper 提供了很多非同步方法,本篇我們就來聊一聊如何在 ASP.NET Core 中使用 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<Author> GetByID(int id); public Task<bool> Insert(Author model); }
有了介面,就可以定義一個類實現這個介面
public class AuthorRepository { private readonly IConfiguration _config; public AuthorRepository(IConfiguration config) { _config = config; } public async Task<Author> 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<Author>( query, new { Id = id }); return result.FirstOrDefault(); } } public async Task<bool> Insert(Author model) { return false; } }
值得注意的是上面我用了 QueryAsync 方法實現了對 SqlServer 的非同步查詢,接下來再填充一下 非同步方法 Insert。
public async Task<bool> 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<bool> 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<IAuthorRepository , AuthorRepository>(); //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 例項資料的。