2014-09-28 4 views
1

Как часть веб-приложения, которое я разработал на данный момент, у меня есть требование записать файлы на хранение. Сначала изначально будет размещаться на сайтах Azure, но в будущем я хотел бы иметь возможность размещать его на не-лазурных серверах.Azure Storage/File System abstraction library

Итак - я ищу библиотеку (и надеюсь, что она существует), которая упростит переход между выводом файлов в Azure Blob Storage или локальной файловой системой. Идеально то, что будет иметь общий API и позволит вам переключаться между хранилищем, изменяя только файлы конфигурации.

У меня возникли проблемы с поиском библиотек, которые будут иметь такую ​​функциональность, и я надеюсь, что кто-то может указать мне в правильном направлении.

+0

Ok, после того как некоторые более обширные поисков мне удалось c ome через пару библиотек, которые соответствуют законопроекту (но я не совсем доволен ни одним из них). Это: X.Storage (https://www.nuget.org/packages/xstorage/) и FileWarehouse (https://www.nuget.org/packages/FileWarehouse/). Ни один из них не предлагает одну из ключевых функций, которые я ищу - расширяемая конфигурация на основе конфигурации (вдоль строк log4net). Отправная точка, не менее –

ответ

0

Не уверен, существует ли такая библиотека. Если существует библиотека абстракции, я бы подумал, что ей потребуется обеспечить реализацию Azure, S3, локального FileSytem, ​​Rackspace и т. Д.

В любом случае, это довольно просто реализовать. Наш проект имел две разные версии, основанные на облаке и на основе, основанные на основной реальной разнице, являющейся хранилищем Blob. Мы сделали так, чтобы создать основную загрузку/загрузку и т. Д. С интерфейсом, иметь две разностные реализации: один для хранилища Azure Blob и один для локального хранилища файлов, используемый StructureMap для получения ссылки на конкретную реализацию на основе значения конфигурации

мы, очевидно, не копировать каждый и каждый API BLOB Storage в интерфейсе, но только минимально необходимый нашей системой

Некоторого примера кода:

интерфейс: (BlobBase наш пользовательский класс держат данные, такие как имя контейнера, имя файла, тип контента и т. д., а BlobStorageProviderStatus - это обычное перечисление, предоставляющее некоторую информацию о состоянии, но вы получаете идею!)

public interface IBlobStorageProvider 
{ 
    void CreateContainer(string containerName); 
    BlobStorageProviderStatus UploadFile(BlobBase file, bool uploadAsNewversion, Stream data, int chunk, int totalChunks, out string version); 
    BlobStorageProviderStatus DownloadToStream(BlobBase file, Stream target, int chunkSize, IClientConnection clientConnection); 
    void Delete(BlobBase blobBase); 
    void DeleteDirectory(string directoryPath, string blobContainer); 
    BlobStorageProviderStatus UploadFile(string container, string folder, string fileName, Stream data, string contentType); 
    void DownloadToStream(string container, string filePath, Stream target); 
} 

Web.config имеет

<add key="AzureBlobStorage" value="true" /> 

и упрощенный вариант StructureMap Registeration:

x.For<IBlobStorageProvider>() 
        .Use(() => bool.Parse(ConfigurationManager.AppSettings["AzureBlobStorage"]) 
            ? new AzureBlobStorageProvider() 
            : new FileSystemStorageProvider()); 

и фактического использования образца:

IBlobStorageProvider blobStorage = ObjectFactory.GetInstance<IBlobStorageProvider>(); 
blobStorage.CreateContainer("image"); 
+1

Спасибо за сообщение и за то, что нашли время, чтобы зайти в детали! Я думал о решении по этим направлениям - просто было интересно, выпустил ли кто-то его в качестве предварительно упакованной библиотеки. Это похоже на достаточно распространенный сценарий. –

+1

На самом деле, я могу просто оставить вопрос открытым еще пару дней на всякий случай, если кто-то знает о готовой библиотеке. –

+0

Я тоже искал такую ​​библиотеку, и в итоге я стал кататься самостоятельно. Было бы неплохо иметь такую ​​библиотеку абстракции, учитывая, что все поставщики хранилищ прорастают. –

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