我有一個大型的應用程序,有30多個項目,目前使用的是IRepository和POCO實體。我想知道是否有辦法使用表存儲而不必實施ITableEntity。我不想將Azure存儲塊塊包導入每個項目,並將所有實體更改爲使用ITableEntity。您可以將Azure表存儲IQueryable(table.CreateQuery())作爲POCO公開嗎?
實體Adapater
我知道,有可能創建一個實體適配器(例如低於)讀取或寫入一個單獨的實體時工作得很好。但是當我嘗試通過table.CreateQuery()公開IQueryable時,我一直無法獲得這個工作。
public class AzureEntity
{
public Guid Id { get; set; }
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset Timestamp { get; set; }
public string ETag { get; set; }
}
internal class AzureStorageEntityAdapter<T> : ITableEntity where T : AzureEntity, new()
{
#region Properties
/// <summary>
/// Gets or sets the entity's partition key
/// </summary>
public string PartitionKey
{
get { return InnerObject.PartitionKey; }
set { InnerObject.PartitionKey = value; }
}
/// <summary>
/// Gets or sets the entity's row key.
/// </summary>
public string RowKey
{
get { return InnerObject.RowKey; }
set { InnerObject.RowKey = value; }
}
/// <summary>
/// Gets or sets the entity's Timestamp.
/// </summary>
public DateTimeOffset Timestamp
{
get { return InnerObject.Timestamp; }
set { InnerObject.Timestamp = value; }
}
/// <summary>
/// Gets or sets the entity's current ETag.
/// Set this value to '*' in order to blindly overwrite an entity as part of an update operation.
/// </summary>
public string ETag
{
get { return InnerObject.ETag; }
set { InnerObject.ETag = value; }
}
/// <summary>
/// Place holder for the original entity
/// </summary>
public T InnerObject { get; set; }
#endregion
#region Ctor
public AzureStorageEntityAdapter()
{
// If you would like to work with objects that do not have a default Ctor you can use (T)Activator.CreateInstance(typeof(T));
this.InnerObject = new T();
}
public AzureStorageEntityAdapter(T innerObject)
{
this.InnerObject = innerObject;
}
#endregion
#region Methods
public virtual void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext)
{
TableEntity.ReadUserObject(this.InnerObject, properties, operationContext);
}
public virtual IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext)
{
return TableEntity.WriteUserObject(this.InnerObject, operationContext);
}
#endregion
}
我希望能夠做這樣的事......
public class TableStorageRepository : IRepository
{
// snip...
public IQueryable<T> FindAll<T>() where T : class, new()
{
CloudTable table = GetCloudTable<T>();
return table.CreateQuery<AzureStorageEntityAdapter<T>>();
}
// snip...
}
這裏的問題是的createQuery創建
IQueryable<AzureStorageEntityApater<T>>.
我看不到如何獲得所有'InnerObjects'的IQueryable。
有誰知道是否可以通過某種方式暴露IQueryable而不暴露ITableEntity?
感謝您的寶貴意見。雖然不是我想要的,但我很欣賞你的反饋。 我不想用自己的存儲庫注入和包裝系統中的每個實體,我假設公開DynamicTableEntity也帶來了它的存儲庫依賴?首先將ITable解耦使用純POCO的目的是試圖避免這種情況。 我還沒有找到解決方案,我不確定目前存在的解決方案。但我會繼續搜索.. :) –