7. オブジェクトストレージ¶
ここではオブジェクトストレージの利用方法について説明します。
7.1. バケットインスタンスの生成¶
オブジェクトストレージを操作する際は、NbObjectBucket クラスのインスタンスを生成する必要があります。 引数にバケット名を指定して NbObjectBucket を生成します。
var empBucket = new NbObjectBucket<NbObject>("Employee");
7.2. オブジェクトの新規追加¶
オブジェクトは NbObject として生成します。 以下、新規追加する例を示します。
var obj = empBucket.NewObject();
// または var obj = new NbObject("Employee");
obj["name"] = "Taro Nichiden";
obj["email"] = "taro@example.com";
obj["age"] = 27;
var resultObj = await obj.SaveAsync();
NbObjectBucket.NewObject() または NbObject.New() を使って NbObject を生成します。 値はインデクサ(["key名"])で設定します。
SaveAsync() メソッドを呼び出すことで、オブジェクトを保存します。
7.2.1. オブジェクトに設定できる値¶
オブジェクトで設定できる値は、以下のいずれかのクラスのインスタンスです。
- 数値 (int, long, short, float, double)
- string
- bool
- NbJsonObject
- NbJsonArray
NbJsonObject, NbJsonArray はそれぞれ JSON オブジェクトおよび配列に相当します。 NbJsonObject, NbJsonArray に格納できる値も上記いずれかのクラスのインスタンスです。 また、NbJsonObject, NbJsonArray は入れ子にすることが可能です。
以下に例を示します。
obj["name"] = "Taro Nichiden"; // string
obj["age"] = 27; // int
obj["married"] = true; // bool
NbJsonObject contact = new NbJsonObject() {
{"tel", "03-xxxx-yyyy"},
{"email", "taro@example.com"}
};
obj["contact"] = contact; // JSON Object
NbJsonArray array = new NbJsonArray() { "Tennis", "Fishing" };
obj["hobbies"] = array; // JSON Array
7.3. アクセス制御¶
オブジェクト単位でアクセス制御を行うことができます。
アクセス制御には、ACLクラスを使用します。NbObject の ACL プロパティに設定します。
var acl = new NbAcl();
acl.Owner = "オーナID";
acl.R.Add("ユーザID");
acl.R.Add("g:グループ名");
acl.W.Add("ユーザID");
var obj = NbObject.New("Todos");
obj.ACL = acl;
- Owner にオーナID(オーナのユーザID)を設定します。
- R, W, C, U, D プロパティにエントリを追加します。
- これらは HashSet<string> になっており、Add で値を追加できます。
- グループを指定する場合は "g:" プレフィクスが必要です。
7.4. オブジェクトの更新¶
オブジェクトを更新するには、NbObject の SaveAsync() メソッドを使用します。
最初にクエリを行って NbObject のインスタンスを取得し、 オブジェクトに値を設定して SaveAsync() を呼び出すという流れになります。
7.5. オブジェクトの削除¶
オブジェクトを更新するには、NbObject の DeleteAsync() メソッドを使用します。
更新の場合と同様最初にクエリを行って NbObject のインスタンスを取得し、 その後 DeleteAsync() を呼び出すという流れになります。
7.6. NbObject のサブクラス化¶
NbObject をサブクラス化することができます。 サブクラス化することにより、フィールドアクセスをプロパティアクセスで ラップすることが可能です。
以下に例を示します。
public class Employee : NbObject
{
// 引数なしコンストラクタ(必須)
public Employee() : base("Employee") {}
// パラメータ付きコンストラクタ
public Employee(NbBucketType type = NbBucketType.Online,
NbService service = null)
: base("Employee", type, service) {}
// "name" フィールドアクセスを Name プロパティでラップ
public string Name {
get { return this["name"] as string; }
set { this["name"] = value; }
}
}
サブクラス化したクラスは、必ず引数なしコンストラクタを実装 する必要があります。引数なしコンストラクタは、バケット名を 指定して基底クラスのコンストラクタを呼び出して下さい。
使用例は以下の通りです。
// オブジェクトの生成と保存
var emp = new Employee() {
Name = "Taro Nichiden"
};
await emp.SaveAsync();
// バケット取得時は型パラメータを指定する
var empBucket = new NbObjectBucket<Employee>("employee");
// クエリ (返り値の型は IEnumerable<Employee>)
var employees = await empBucket.QueryAsync(new NbQuery());