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
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作 編程是個人愛好