Skip to content

Instantly share code, notes, and snippets.

@Jonesie
Last active October 18, 2021 21:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jonesie/424884a6c4f4e3ea687913895a612e84 to your computer and use it in GitHub Desktop.
Save Jonesie/424884a6c4f4e3ea687913895a612e84 to your computer and use it in GitHub Desktop.
A small collection of type converter that are used to map types in and out of DynamoDB items.

.Net TypeConverters for DynamoDB

Here's a small collection of type converter that are used to map types in and out of DynamoDB items. Each is used on the item class, e.g:

  [DynamoDBTable("UserInvites")]
  public class UserInviteItem
  {
    [DynamoDBHashKey]
    [DynamoDBProperty(typeof(GuidTypeConverter))]
    public Guid ID { get; set; }
    [DynamoDBProperty]
    public string Email { get; set; }
    [DynamoDBProperty]
    public string Code { get; set; }
    [DynamoDBProperty]
    public Guid OrganisationID { get; set; }
    [DynamoDBProperty]
    public string Message { get; set; }
    [DynamoDBProperty]
    public string Role { get; set; }
    [DynamoDBProperty(typeof(DateTimeOffsetTypeConverter))]
    public DateTimeOffset Sent { get; set; }
    [DynamoDBProperty(typeof(NullableDateTimeOffsetTypeConverter))]
    public DateTimeOffset? Accepted { get; set; }

  }
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using System;
namespace barXui.Models.Data.Dynamo
{
public class DateTimeOffsetTypeConverter : IPropertyConverter
{
public object FromEntry(DynamoDBEntry entry)
{
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
throw new ArgumentOutOfRangeException();
return DateTimeOffset.Parse(primitive.Value.ToString());
}
public DynamoDBEntry ToEntry(object value)
{
try
{
return new Primitive
{
Value = ((DateTimeOffset)value).ToString("o")
};
}
catch
{
return new Primitive
{
Value = (new DateTimeOffset()).ToString("o")
};
}
}
}
}
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using System;
namespace barXui.Models.Data.Dynamo
{
public class GuidTypeConverter : IPropertyConverter
{
public object FromEntry(DynamoDBEntry entry)
{
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
throw new ArgumentOutOfRangeException();
return Guid.Parse(primitive.Value.ToString());
}
public DynamoDBEntry ToEntry(object value)
{
try
{
return new Primitive
{
Value = ((Guid)value).ToString()
};
}
catch
{
return new Primitive
{
Value = Guid.Empty.ToString()
};
}
}
}
}
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using System;
namespace barXui.Models.Data.Dynamo
{
/// <summary>
/// Partition keys must be string
/// </summary>
public class IntTypeConverter : IPropertyConverter
{
public object FromEntry(DynamoDBEntry entry)
{
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
throw new ArgumentOutOfRangeException();
return Convert.ToInt32(primitive.Value.ToString());
}
public DynamoDBEntry ToEntry(object value)
{
try
{
return new Primitive
{
Value = ((int)value).ToString()
};
}
catch
{
return new Primitive
{
Value = "0"
};
}
}
}
}
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using System;
namespace barXui.Models.Data.Dynamo
{
public class NullableDateTimeOffsetTypeConverter : IPropertyConverter
{
public object FromEntry(DynamoDBEntry entry)
{
Primitive primitive = entry as Primitive;
if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
throw new ArgumentOutOfRangeException();
return primitive.Value == null ? null : DateTimeOffset.Parse(primitive.Value.ToString());
}
public DynamoDBEntry ToEntry(object value)
{
try
{
return new Primitive
{
Value = ((DateTimeOffset)value).ToString("o")
};
}
catch
{
return new Primitive
{
Value = null
};
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment