Cassandra 生態系提供非常多語言的 Client Drivers,可以在官方網站查看針對各語言提供的工具。這次同樣使用 .NET6 WebAPI 專案搭配 NuGet 套件進行開發。
先建立要使用的 Keyspace 和 Table,具體操作細節可參考昨天的文章。
cqlsh> CREATE KEYSPACE user_info WITH replication = { 'class':'SimpleStrategy', 'replication_factor':1 };
cqlsh> use user_info;
cqlsh:user_info> CREATE TABLE notification_setting ( user_id text PRIMARY KEY, need_notify boolean, email text);
建立 WebAPI 專案,版本為 .NET6
,命名為 IronmanCassandraDbDemo
。
專案加入對 CassandraCSharpDriver NuGet套件 的參考。
把接下來會需要用到的常數都先放在 Consts.cs 中。
public static class Consts
{
public static string Host = "localhost";
public static int Port = 1236;
public static string KeySpaceName = "user_info";
}
在 Program.cs 中注入 Cassandra.Cluster
並設定連線資訊,接著注入 Cassandra.ISession
。
注意這些類別的 Namespace,小心不要誤用到微軟本身提供的類別。
// Add services to the container.
builder.Services.AddSingleton(Cluster.Builder()
.AddContactPoints(Consts.Host)
.WithPort(Consts.Port)
.Build());
builder.Services.AddTransient(sp =>
{
var cluster = sp.GetRequiredService<Cluster>();
return cluster.Connect(Consts.KeySpaceName);
});
建立 NotificationSettingsController.cs ,並在建構子取得剛剛注入的 ISession。
[ApiController]
[Route("[controller]/[action]")]
public class NotificationSettingsController : ControllerBase
{
private readonly ISession _session;
public NotificationSettingsController(ISession session)
{
_session = session;
}
}
建立 NotificationSettings
類別。
public class NotificationSettings
{
public string UserId { get; set; }
public bool NeedNotify { get; set; }
public string Email { get; set; }
}
接下來就可以建立各功能的 endpoint 及功能了,包含:
因為是練習且東西不複雜,就偷懶不再特別做額外的分層。
首先先建立新增或修改 Email 通知設定的 API。基本上使用起來跟直接透過 cqlsh 下 cql 差不多,直接寫好語法後呼叫 session.Execute("你的語法");
即可。如果需要設定參數,則使用 Prepare("你的語法").Bind(參數們)
的方式,語法中要帶入參數的部分使用 ?
,並在 Bind()
中依序傳入。
變數要以參數傳遞,不要自己做字串相加或組合。
[HttpPost]
public IActionResult Upsert([FromBody]NotificationSettings payload)
{
var statement = this._session
.Prepare(@"INSERT INTO notification_setting (user_id, need_notify, email) VALUES (?, ?, ?);")
.Bind(payload.UserId, payload.NeedNotify, payload.Email);
this._session.Execute(statement);
return NoContent();
}
接著是查尋的 API,從 Execute
的回傳取出第一個 Row,並使用 row.GetValue<型別>("欄位名稱")
取出資料。
[HttpGet]
public IActionResult Get(string userId)
{
var statement = this._session
.Prepare(@"SELECT user_id, need_notify, email FROM notification_setting WHERE user_id = ?;")
.Bind(userId);
var row = this._session.Execute(statement).FirstOrDefault();
if (row is null)
{
return NotFound();
}
return Ok(new NotificationSettings
{
UserId = row.GetValue<string>("user_id"),
NeedNotify = row.GetValue<bool>("need_notify"),
Email = row.GetValue<string>("email"),
});
}
最後是刪除的功能。
[HttpDelete]
public IActionResult Remove(string userId)
{
var statement = this._session
.Prepare(@"DELETE FROM notification_setting WHERE user_id = ?;")
.Bind(userId);
this._session.Execute(statement);
return NoContent();
}
這樣基本的 API 就開發完成了!