0%

[DotnetCore]ORM系列-Chloe:入門篇

前情提要

筆者被朋友推薦使用Chloe,查了一下也看到ORM框架效能比較文章,效能是真的很棒,使用上也是透過linq實現所有事情,這篇主要介紹Chloe ORM套件的使用,搭配筆者之前建立的MySQL範例資料庫,做一些簡單的Select查詢示範,之後會再慢慢介紹整個應用。前置作業參考

內容

建立Demo API專案

1
2
3
4
5
6
7
8
9
10
11
# 建立資料夾
mkdir Demo.ORM.Chloe
cd Demo.ORM.Chloe
# 建立API專案
dotnet new webapi -n Demo.ORM.Chloe.API
cd Demo.ORM.Chloe.API
# 安裝Chloe套件,筆者這邊使用MySql,因此安裝Chloe.MySql
dotnet add package Chloe.MySql
# 因要存取MySql,需要MySql Driver套件
dotnet add package MySqlConnector

撰寫程式

宣告連線字串

appsettings.Development.json中多加入一組設定

1
2
3
"ConnectionStrings": {
"ClassicModels": "Server=localhost;Database=classicmodels;Uid=YOURACCOUNT;Pwd=YOURPASSWORD"
}

撰寫ConnectionFactory並註冊

Chloe套件的github wiki中就有教學,筆者這邊就直接照抄了,首先設定MySqlConnectionFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MySqlConnectionFactory : IDbConnectionFactory
{
string _connString = null;
public MySqlConnectionFactory(string connString)
{
this._connString = connString;
}
public IDbConnection CreateConnection()
{
IDbConnection conn = new MySqlConnection(this._connString);
return conn;

}
}

註冊於Startup

1
2
3
4
5
6
7
8
9
10
public void ConfigureServices(IServiceCollection services)
{
// 以上省略
services.AddScoped<ChloeORM.IDbContext>((serviceProvider) =>
{
return new ChloeORM.MySql.MySqlContext(
new MySqlConnectionFactory(Configuration.GetConnectionString("ClassicModels")));
});
// 以下省略
}

宣告資料庫對應的Model

這一步就是ORM中的M來著,基本上因為沒有配套的POCO Generator,需要手動宣告,若db中的命名與程式端的名稱要不一樣則,套件有開放TableColumn對應的Attribute可以設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Customers
{
public int CustomerNumber { get; set; }
public string CustomerName { get; set; }
public string ContactLastName { get; set; }
public string ContactFirstName { get; set; }
public string Phone { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public int? SalesRepEmployeeNumber { get; set; }
public decimal CreditLimit { get; set; }
}

撰寫Service並註冊

先宣告一個ICustomerService

1
2
3
4
public interface ICustomerService
{
IEnumerable<Customers> GetCustomerList();
}

接著實作上述宣告的Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CustomerService : ICustomerService
{
// 因上步驟Startup中有註冊,這邊就由Constructor注入得到Chloe的IDbContext
private readonly IDbContext _db;

public CustomerService(IDbContext db)
{
_db = db;
}

public IEnumerable<Customers> GetCustomerList()
{
// 筆者這邊為方便,只取前十筆
return _db.Query<Customers>()
.OrderBy(x => x.CustomerNumber)
.TakePage(1, 20).ToList();
}
}

註冊於Startup

1
2
3
4
5
6
public void ConfigureServices(IServiceCollection services)
{
// 以上省略
services.AddTransient<ICustomerService, CustomerService>();
// 以下省略
}

撰寫API Controller

最後宣告API Controller,我們透過PostmanSwagger API文件頁面操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Route("api/[controller]")]
[ApiController]
public class CustomerController : ControllerBase
{
private readonly ICustomerService _customerService;

public CustomerController(ICustomerService customerService)
{
_customerService = customerService;
}

/// <summary>
/// 取得客戶清單
/// </summary>
/// <returns></returns>
[ProducesResponseType(typeof(IEnumerable<Customers>), StatusCodes.Status200OK)]
[HttpPost("")]
public IActionResult Index()
{
return Ok(_customerService.GetCustomerList());
}
}

整個專案目錄結構如下

顯示結果

結論

其實看Chloe的github wiki頁面,基本上就滿清楚使用方式的,若要說缺點,大概就是沒有相對應的POCO Generator,因此必須得手動宣告,除了這個,筆者覺得開發,效能角度都算是名列前茅的、以筆者以這篇撰寫的demo專案來說,筆者只用了半小時的時間完成,算是開發角度上非常快速的搭建起開發環境的,筆者會再花些篇幅介紹Chloe其他的應用。

參考