我有一个大型的应用程序,有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的目的是试图避免这种情况。 我还没有找到解决方案,我不确定目前存在的解决方案。但我会继续搜索.. :) –