我在上一篇的文章將 AirTable 做為資料庫的心得,有寫到:我為什麼使用 AirTable 當作資料庫,以及優、缺點,並且環境是 Node.js ,語言是 TypeScript ,而這次想要使用 .NET Core 、 C# 來改寫。
串接 AirTable 所需要的 APIKey、BaseID,可以參考的上一篇的文章,而連結 AirtTable 使用的套件是 airtable.net ,並且使用 Nuget 安裝即可。
仿造原本 TypeScript 的寫法,寫一個泛型類別,將取得資料、新增、修改及刪除都封裝起來。
public class DataService : IDataService
{
private string m_ApiKey;
public DataService(IConfiguration configuration)
{
this.m_ApiKey = configuration.GetValue<string>("AirTable:ApiKey");
}
public async Task<IEnumerable<T>> GetDatas<T>(string baseId, string tableName) where T : BaseModel
{
........
}
public async Task<AirtableCreateUpdateReplaceRecordResponse> SaveData<T>(string baseId, string tableName, T model) where T : BaseModel
{
...........
}
public async Task<AirtableCreateUpdateReplaceRecordResponse> UpdateData<T>(string baseId, string tableName, T model) where T : BaseModel
{
...........
}
public async Task<AirtableDeleteRecordResponse> DeleteData(string baseId, string tableName, string id)
{
............
}
// BaseModel.cs
public class BaseModel
{
public string Id { get; set; }
}
// DataService.cs
public async Task<IEnumerable<T>> GetDatas<T>(string baseId, string tableName) where T : BaseModel
{
string offset = null;
List<T> models = new List<T>();
List<AirtableRecord<T>> records = new List<AirtableRecord<T>>();
AirtableListRecordsResponse<T> res;
using (AirtableBase airtable = new AirtableBase(this.m_ApiKey, baseId))
{
do
{
res = await airtable.ListRecords<T>(tableName, offset);
records.AddRange(res.Records);
offset = res.Offset;
} while (offset != null);
}
models = records
.Select(m =>
{
m.Fields.Id = m.Id;
return m.Fields;
})
.ToList();
return models;
}
可以先參考 airtable.net 的 GitHub,建立 AirtableBase
的實體,之後用 ListRecords<T>
泛型方法,讀取 AirTable 中的資料。
再來使用 Select
方法轉換物件,取得屬性 Fields
,並且將由 AirTable 自動產生的 Id
鍵值保存下來。
最後使用 Postman 測試,Response 的結果如上圖所示,而 id
就是 AirtTable 自動產生的 Id
鍵值。
public async Task<AirtableCreateUpdateReplaceRecordResponse> SaveData<T>(string baseId, string tableName, T model) where T : BaseModel
{
var fields = this.GetFields<T>(model);
AirtableCreateUpdateReplaceRecordResponse res;
using (AirtableBase airTable = new AirtableBase(this.m_ApiKey, baseId))
{
res = await airTable.CreateRecord(tableName, fields);
}
return res;
}
private Fields GetFields<T>(T model) where T : BaseModel
{
var dic = new Dictionary<string, object>();
var props = typeof(T).GetProperties();
foreach (var prop in props)
{
object value = prop.GetValue(model);
dic.Add(prop.Name, value);
}
var fields = new Fields
{
FieldsCollection = dic
};
return fields;
}
在寫入資料前需要進行處理,建立方法 GetFields<T>
來處理,因為Fields
內部是使用Dctionary<Tkey, TValue>
來保存資料,所以採用反射的方式,將T
輔換成Dctionary<Tkey, TValue>
。
之後新增資料使用CreateRecord
方法,將Fields
物件傳入。
public async Task<AirtableCreateUpdateReplaceRecordResponse> UpdateData<T>(string baseId, string tableName, T model) where T : BaseModel
{
var fields = this.GetFields<T>(model);
AirtableCreateUpdateReplaceRecordResponse res;
using (AirtableBase airTable = new AirtableBase(this.m_ApiKey, baseId))
{
res = await airTable.UpdateRecord(tableName, fields, model.Id);
}
return res;
}
修改資料是呼叫 UpdateRecord
方法,和新增資料類似,只差別在 UpdateRecord
會多傳唯一 Id
鍵值。
目前覺得 AirTable 寫 Side Project 的好幫手,除了上次的 TypeScript 的版本外,而這次想轉成 .NET Core 的版本,之後我在將這些程式包裝成 Nuget 的版本,請大家參考看看。
原始碼位置:https://github.com/thomascsd/BookApi