0

我正在嘗試爲AWS DynamoDB創建一個可充當DAL(數據訪問層)的通用包裝庫(C#/ .NET)。使用此庫的應用程序將不會與AWS庫緊密結合,因爲稍後可能會更改它。亞馬遜Dynamo DB持久性ORM

的方法的結構,以從包裝類暴露是 InsertItem < T>(對象)的updateItem < T>(對象)DeleteItem < T>(ID /對象)列表< T> GETALL()ŤGetByParameter (Id)

我看到有三種方法使用AWSSDK來使用AWS DynamoDB服務。

方法(1):低級別訪問 - 將模型轉換爲aws hashmap輸入結構並調用getItem()/ putItem()。

方法(2):高級訪問使用文檔 - 模式轉換到AWS文檔模型並通過文檔對象AWS。

方法(3):高級訪問使用持久性 - 在模型中使用屬性DynamoDBTable映射模型dynamoDb表,並使用LINQ操作以獲取/更新表。

在方法(1)&(2)中,我發現很難將模型映射到dynamoDB表。在方法(3)中,我看到我需要將DynamoDB屬性包含在應用程序中的模型類中,這會使它緊密耦合。

有沒有什麼辦法可以在這種情況下在運行時創建映射或者是否有其他方法?

我也想過我是否可以json序列化/反序列化模型和插入到dynamoDB(在這種情況下,將只有2列 - 身份證,任何模型的JSON身體)。

如果我錯了或丟失了某些東西,請糾正我。

+0

我們一直在寫Dynamo,但沒有閱讀。使用持久性模型,我們在DAL上有一個通用類(我們稱之爲Log ),它具有SDK屬性,並且應用程序可以通過它想要的任何類,並且將在Log 對象的T屬性中設置。 不幸的是,我現在正試圖讀取這些數據,並且由於我希望查看所有日誌,而不管寫入時使用了T,因此使用持久性證明它很困難。用T,字符串,對象或Document替換單獨的讀取類沒有工作。將嘗試讀取非持久性,如果成功,將會更新。 –

+0

感謝您的更新。如果您有任何其他信息,請告訴我。 – Sri

回答

1

接下來是我前進的解決方案,減去一些無關的細節。最大的挑戰在於讀取任意類型的數據,因爲您無法從JSON中輕鬆分辨出來。

在我的解決方案中,選擇寫入類型的消費應用程序也知道如何識別在讀取時要反序列化的類型。這是必要的,因爲我需要返回多個不同類型的日誌,因此將JSON返回給消費者並讓他們處理它更有意義。如果你想在DAL中包含它,你可以在數據庫中添加一個類型列並使用反射來轉換它,儘管我認爲你在一次調用中仍然會返回多種類型的數據。

我們爲消費而呈現的接口具有讀取/寫入方法(您可以添加任何您需要的)。請注意,如上所述,寫入允許指定T,但讀取需要調用者反序列化。

public interface IDataAccess 
{ 
    Task WriteAsync<T>(Log<T> log) where T : class, new(); 
    Task<IEnumerable<LogDb>> GetLogsAsync(long id); 
} 

一個LogDb類包含持久性屬性:

[DynamoDBTable("TableName")] 
public class LogDb 
{ 
    [DynamoDBHashKey("Id")] 
    public long Id{ get; set; } 

    [DynamoDBProperty(AttributeName = "Data", Converter = typeof(JsonStringConverter))] 
    public string DataJson { get; set; } 
} 

一個普通的日誌<牛逼>類使用強類型的寫作。在IDataAccess實現中調用ToDb()方法實際寫入數據庫。

public class Log<T> 
    where T : class, new() 
{ 
    public Log() { } 

    public Log(LogDb logDb) 
    { 
     Data = licensingLogDb.OldDataJson.Deserialize<T>(); 
     Id = licensingLogDb.Id; 
    } 

    public long Id { get; set; } 
    public T Data { get; set; } 

    public LogDb ToDb() 
    { 
     string dataJson = Data.Serialize(); 
     return new LogDb 
     { 
      DataJson = dataJson, 
      Id = Id 
     }; 
    } 
} 

的JsonStringConverter在LogDb屬性應用於DataJson財產的JSON字符串轉換以及從DynamoDB:構造以在LogDb將通過已經確定了相應類型的反序列化消費應用中使用文件:

public class JsonStringConverter : IPropertyConverter 
{ 
    public DynamoDBEntry ToEntry(object value) 
    { 
     string json = value as string; 
     return !String.IsNullOrEmpty(json) 
      ? Document.FromJson(json) 
      : null; 
    } 

    public object FromEntry(DynamoDBEntry entry) 
    { 
     var document = entry.AsDocument(); 
     return document.ToJson(); 
    } 
} 

一個輔助類提供了序列化和反序列化擴展,使用JSON.NET的JsonConvert.Serialize /反序列化,但null檢查:

public static class JsonHelper 
{ 
    public static string Serialize(this object value) 
    { 
     return value != null 
      ? JsonConvert.SerializeObject(value) 
      : String.Empty; 
    } 

    public static T Deserialize<T>(this string json) 
     where T : class, new() 
    { 
     return !String.IsNullOrWhiteSpace(json) 
      ? JsonConvert.DeserializeObject<T>(json) 
      : null; 
    } 
}