2013-03-28 5 views
5

Возможно ли иметь неочищенный POCO для хранения таблиц Azure?Непроизводные POCO и лазурные хранилища

Иными словами, POCO, который не является результатом TableEntity или реализует ITableEntity?

Кажется, что шаг назад должен иметь модель, которая зависит от интерфейса или базового класса, поскольку это вызывает утечку ссылок вверх в цепочке - я не могу настроить модель на другом уровне, не имея необходимости знать о ней Azure Storage для интерфейса или базового класса!

ответ

7

Посмотрите на DynamicTableEntity (ctrl + f для этого). Его можно использовать для запроса и вставки объектов.

Используя этот тип, вы не будете вводить какие-либо зависимости внутри вашей модели домена, однако вам придется преобразовать POCO в DynamicTableEntity самостоятельно - этот процесс может быть легко автоматизирован, хотя, если вы хотите указать свои POCO с пользовательским интерфейсом и написанием картографа (в основном вам нужен словарь свойств +, нужно знать, какие из них - раздел/RowKey).

Причина, по которой вы не можете просто сохранить какой-либо объект в хранилище таблиц Azure, заключается в том, что ему необходимо знать, какое свойство действует как ключ раздела и как ключ строки. Потенциал работы с DynamicTableEntity на «нижнем уровне» заключается в том, что вы можете создавать запросы, которые возвращают только подмножество свойств, что уменьшает потребление ресурсов. Это может быть или не быть полезным в вашем случае.

-1

Во-первых, есть еще одна альтернатива TableEntity и ITableEntity, что использовать DataServiceKey атрибут для украшения вашего класса, как в следующем примере:

[DataServiceKey("PartitionKey", "RowKey")] 
public class MyEntity 
{ 
    public string PartitionKey {get; set;} 
    public string RowKey {get; set;} 
    public DateTime Timestamp {get; set;} 
    //other properties 
} 

Однако, это не реально решить вашу проблему не желая утечки реализации Azure в ваш модельный класс. В этом случае, я думаю, вы можете взглянуть на использование реализации оболочки, например LOKAD Fat Entities. Lokad будет обрабатывать сериализацию/десериализацию вашего объекта модели в оболочку, которая, в свою очередь, хранится в хранилище таблиц. Однако один недостаток Lokad состоит в том, что ваши объекты становятся непрозрачными на складе, и вы не можете просматривать их с чем-то вроде Azure Storage Explorer.

+0

Это не работает в текущей версии SDK. – James

0

Посмотрите на упаковке я реализовал и поставить в NuGet: https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Он также добавил в Azure Storage SDK следующей версии: https://github.com/Azure/azure-storage-net/pull/337/files

Описание:

предоставляет функциональные возможности сгладить сложные объекты в словаре EntityProperty и функциональность для перекомпоновки исходного сложного объекта из словаря сглаженных свойств. Одно использование заключается в том, что API позволяет записывать любой сложный объект с вложенными свойствами в хранилище таблиц Azure в сплющенной форме, что обычно невозможно при использовании SDK Azure Storage Client.

Версия 2.0 теперь также поддерживает запись и чтение IEnumerable свойств типа, таких как списки, массивы, словари для Azure Table Storage.

Блог: https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

Использование: // Свести объект и преобразовать его в EntityProperty словарь

словарь flattenedProperties = ObjectFlattenerRecomposer.Flatten (complexObject);

// Создаем DynamicTableEntity и устанавливаем его PK и RK DynamicTableEntity dynamicTableEntity = new DynamicTableEntity (partitionKey, rowKey);

dynamicTableEntity.Properties = flattenedProperties;

// Записываем DynammicTableEntity к Azure Table Storage с помощью клиента SDK

// Читаем объект назад от AzureTableStorage в DynamicTableEntity, используя тот же PK и RK DynamicTableEntity объект = [Read из Azure с использованием ПК и RK] ;

// Преобразование DynamicTableEntity обратно в исходный сложный объект. Представьте, что оригинальный комплект объекта Объект был типа Order.

Заказ заказа = ObjectFlattenerRecomposer.ConvertBack (entity.Properties);

+0

Я бы хотел использовать это, но пакет NuGet не будет установлен для целевого проекта .NET 4.5 ... можете ли вы изменить требования к пакету или это жесткое требование? – ramseyjacob

+1

извините за поздний ответ. Я перестроил пакет с .NET 4.5, также добавил поддержку для записи и чтения Nullable, TimeSpan, DateTimeOffset, свойств Enum для хранения таблиц. пакет находится в Nuget: https://www.nuget.org/packages/ObjectFlattenerRecomposer/1.1.1 –

Смежные вопросы