前情提要
筆者被朋友推薦使用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
dotnet new webapi -n Demo.ORM.Chloe.API cd Demo.ORM.Chloe.API
dotnet add package Chloe.MySql
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中的命名與程式端的名稱要不一樣則,套件有開放Table
、Column
對應的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 { 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
,我們透過Postman
或Swagger 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; }
[ProducesResponseType(typeof(IEnumerable<Customers>), StatusCodes.Status200OK)] [HttpPost("")] public IActionResult Index() { return Ok(_customerService.GetCustomerList()); } }
|
整個專案目錄結構如下
顯示結果
結論
其實看Chloe的github wiki頁面,基本上就滿清楚使用方式的,若要說缺點,大概就是沒有相對應的POCO Generator
,因此必須得手動宣告,除了這個,筆者覺得開發,效能角度都算是名列前茅的、以筆者以這篇撰寫的demo專案來說,筆者只用了半小時的時間完成,算是開發角度上非常快速的搭建起開發環境的,筆者會再花些篇幅介紹Chloe
其他的應用。
參考