2016-09-02 3 views
2

MyTableItemで定義された項目を持つDynamoDBテーブルにをDynamoDBPropertyとして追加する必要があります。C#DynamoDB複合型IList <T>コンバータ

このAWS Documentation pageの情報を使用して、MyCustomTypeIList<MyCustomType>ではなく)のコンバータを実装しました。 しかし、新しいMyTableItemを作成すると、ToEntry()メソッドが、IList<MyCustomType>のオブジェクトであり、MyCustomTypeではないオブジェクトをパラメータとして受け取っていることに気付きました。私はリスト(ListまたはIList、または一般にコレクションが)自動的DynamoDBので扱われたことを理解していたドキュメントを読ん

...

どのように私は望ましい結果を達成することができますか?

これはコードです:

// MyTableItem 
[Serializable] 
public class MyTableItem 
{ 
    [DynamoDBHashKey] 
    public string Id { get; set; } 

    [DynamoDBProperty] 
    public string Field1 { get; set; } 

    [DynamoDBProperty] 
    public string Field2 { get; set; } 

    // List of MyCustomType objects 
    [DynamoDBProperty(typeof(MyCustomTypeConverter))] 
    public IList<MyCustomType> CustomField { get; set; } 
} 

// MyCustomType 
[Serializable] 
public class MyCustomType 
{ 
    public string DocumentType { get; set; } 
    public string Status { get; set; } 
    public string Code { get; set; } 
} 

// Converter methods 
public class MyCustomTypeConverter : IPropertyConverter 
{ 
    public DynamoDBEntry ToEntry(object value) 
    { 
     if (value == null) 
      return new Primitive { Value = null }; 

     MyCustomType item = value as MyCustomType; 
     if (item == null) 
      throw new InvalidCastException("Cannot convert MyCustomType to DynamoDBEntry."); 

     string data = string.Format("{0};{1};{2}", item.DocumentType, item.Status, item.Code); 

     DynamoDBEntry entry = new Primitive { Value = data }; 

     return entry; 
    } 

    public object FromEntry(DynamoDBEntry entry) 
    { 
     if (entry == null) 
      return new MyCustomType(); 

     Primitive primitive = entry as Primitive; 
     if (primitive == null || !(primitive.Value is string) || string.IsNullOrEmpty((string)primitive.Value)) 
      throw new InvalidCastException("Cannot convert DynamoDBEntry to MyCustomType."); 

     string[] data = ((string)(primitive.Value)).Split(new string[] { ";" }, StringSplitOptions.None); 
     if (data.Length != 3) 
      throw new ArgumentOutOfRangeException("Invalid arguments number."); 

     MyCustomType complexData = new MyCustomType 
     { 
      DocumentType = Convert.ToString(data[0]), 
      Status = Convert.ToString(data[1]), 
      Code = Convert.ToString(data[2]) 
     }; 

     return complexData; 
    } 
} 

答えて

0

DynamoDBのSDKがIList<T>をシリアライズも問題を持っていない、それはをデシリアライズトラブルを持っているようです。ちょうど投機ですが、これは恐らくどの具体的なタイプを使うのか分からないためです。

私はあなたと同様のセットアップをしていましたが、List<T>を使用するようにドキュメントを変更しようとしましたが、カスタムIPropertyConverterの実装を追加せずにSDKをデシリアライズすることができました。

インターフェイスの代わりに具体的なリストを公開すると、完全な双方向サポートがそこにしかないように見えます。それが問題の1つの可能な方法です。

IListの問題を解決したい場合は、実際にSDKがあなたに送信しているもの、つまりIListで動作します。リストの項目ではありません。私には、そのリストを反復して各項目をエントリのリストに変換することは意味があります。デシリアライゼーションの場合は、そのコレクションを元に戻し、モデルの新しいリストを作成することができます。

TL;可能であればDRを使用し、IList<T>ではなくTに対してコンバーターを実装してください。