ASP.NET Core アプリケーションにおいて、Azure Data Tables SDK を使用する方法をまとめておきます。
公式ドキュメントに記載のある通りなので、個人的な備忘録です。
github.com
Azure Storage の接続情報管理
Azure Storage の接続情報は、Azure Key Vault および Secret Manager で管理することを前提とします。詳細は、こちらの記事を参照してください。
gooner.hateblo.jp
NuGet パッケージのインストール
現時点で最新の Azure Tables client library である v12 を使います。
Install-Package Azure.Data.Tables -Version 12.2.1
ASP.NET Core アプリケーションの初期化処理
TableServiceClient
クラスのインスタンスを DI コンテナーに登録します。
public void ConfigureServices(IServiceCollection services) { // Table Storage services.AddSingleton(new TableServiceClient(Configuration["WebApi:StorageConnection"])); // Repository services.AddTransient<Infrastructure.IProductRepository, Infrastructure.ProductRepository>(); }
ProductRepository
クラスは、Table Storage にアクセスするためのクラスとして作ることにしました。
商品マスターを題材とするので、Table 名と PartitionKey は Product
としました。
public interface IProductRepository { Task<IList<Product>> GetAsync(); Task<Product> GetByIdAsync(string id); Task InsertAsync(Product product); Task UpdateAsync(Product product); Task DeleteAsync(Product product); } public class ProductRepository : IProductRepository { private readonly TableClient _tableClient; private const string TableName = "Product"; private const string PartitionKey = TableName; public ProductRepository(TableServiceClient tableServiceClient) { _tableClient = tableServiceClient.GetTableClient(TableName); } }
ITableEntity
インターフェイスを継承したエンティティクラスを定義します。
public class Product : ITableEntity { public string PartitionKey { get; set; } public string RowKey { get; set; } public string Desc { get; set; } public string Name { get; set; } public double Price { get; set; } public DateTimeOffset? Timestamp { get; set; } public ETag ETag { get; set; } }
商品を追加する
public async Task InsertAsync(Product product)
{
product.PartitionKey = PartitionKey;
product.RowKey = Guid.NewGuid().ToString();
await _tableClient.AddEntityAsync(product);
}
商品を修正する
public async Task UpdateAsync(Product product)
{
await _tableClient.UpdateEntityAsync(product, product.ETag);
}
商品を削除する
public async Task DeleteAsync(Product product)
{
await _tableClient.DeleteEntityAsync(product.PartitionKey, product.RowKey);
}
商品を ID で検索する
商品 ID には、RowKey を指定します。
public async Task<Product> GetByIdAsync(string id) { return await _tableClient.GetEntityAsync<Product>(PartitionKey, id); }
商品の一覧を取得する
Table へのクエリには OData フィルターを使うこともできますが、タイプセーフではないので LINQ を使うようにします。
public async Task<IList<Product>> GetAsync() { var result = new List<Product>(); var queryResults = _tableClient.QueryAsync<Product>(x => x.PartitionKey == PartitionKey); await foreach (var entity in queryResults) { result.Add(entity); } return result; }