接下來是我前進的解決方案,減去一些無關的細節。最大的挑戰在於讀取任意類型的數據,因爲您無法從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;
}
}
我們一直在寫Dynamo,但沒有閱讀。使用持久性模型,我們在DAL上有一個通用類(我們稱之爲Log),它具有SDK屬性,並且應用程序可以通過它想要的任何類,並且將在Log 對象的T屬性中設置。 不幸的是,我現在正試圖讀取這些數據,並且由於我希望查看所有日誌,而不管寫入時使用了T,因此使用持久性證明它很困難。用T,字符串,對象或Document替換單獨的讀取類沒有工作。將嘗試讀取非持久性,如果成功,將會更新。 –
感謝您的更新。如果您有任何其他信息,請告訴我。 – Sri