Основной класс провайдера к хранилищу

Для возможности работы с собственными типами хранилищ разработчик должен реализовать специальный компонент — провайдер к внешнему хранилищу (далее — просто провайдер). Провайдер представляет собой библиотеку с публичным классом, в котором реализуются определённые программные интерфейсы. Набор интерфейсов определяется возможностями внешнего хранилища.

В простейшем случае, провайдер должен реализовывать два интерфейса: IBinaryStorage и IExtensionInitialize.

public class ExternalStorage : IBinaryStorage, IExtensionInitialize

Интерфейс IBinaryStorage определяет основные параметры хранилища и методы провайдера: идентификатор хранилища, поддерживающий по умолчанию разделы, методы создание, чтения, удаления файлов и др. См. описание интерфейса IBinaryStorage. Реализация методов интерфейса IBinaryStorage определяется способом работы с внешним хранилищем.

Интерфейс IExtensionInitialize определяет метод инициализации провайдера (Initialize), принимающий в сериализованном виде настройки хранилища. Настройки хранилища устанавливаются с помощью графического интерфейса настройки (рассмотрено далее).

Следует обратить внимание, что сервер Docsvision может в течении пользовательской сессии многократно создавать экземпляры класса провайдера и инициализировать его, что может привести к росту потребления ресурсов, если при инициализации создаются дополнительные объекты. Данную особенность следует учитывать при создании класса провайдера.

Для более эффективной работы сервера Docsvision с хранилищем, провайдер может поддерживать интерфейс IStreamedBinaryStorage, позволяющий серверу работать напрямую с потоками чтения/записи к хранилищу. Также может быть поддержан интерфейс IEnumerableBinaryStorage, если провайдер может предоставить идентификаторы всех файлов, хранящихся в определённом разделе хранилища.

public class ExternalStorage : IBinaryStorage,
                               IExtensionInitialize,
                               IStreamedBinaryStorage,
                               IEnumerableBinaryStorage

Класс провайдера должен быть помечен атрибутом DisplayName, содержащим название хранилища.

[DisplayName("External storage name")]
public class ExternalStorage : IBinaryStorage, IExtensionInitialize

Для использования локализованного отображаемого названия можно добавить дополнительный класс, возвращающий название из ресурсов:

class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
  private readonly string resourceName;
  public LocalizedDisplayNameAttribute(string resourceName)
     : base()
  {
     this.resourceName = resourceName;
  }

  public override string DisplayName
  {
     get
     {
        return Resource.ResourceManager.GetString(this.resourceName);
     }
  }
}

Тогда класс провайдера необходимо пометить атрибутом LocalizedDisplayName с указанием ключа локализованного ресурса:

[LocalizedDisplayName("ExternalStorageName")]
public class ExternalStorage : IBinaryStorage, IExtensionInitialize

Чтобы предоставить возможность настройки провайдера с помощью Консоли настройки Docsvision, должна быть разработана графическая форма. Информация о данном компоненте приведена в разделе Графический интерфейс настройки. Название компонента графической формы должно быть указано в атрибуте Editor класса провайдера:

[DisplayNameAttribute("ExternalStorageName")]
[Editor("ExternalStorageProvider.ProviderConfigurationPropertyControl, ExternalStorageProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e955275a11279434, processorArchitecture=MSIL",
        "DocsVision.Platform.WinForms.Controls.IExtensionPropertiesControl, DocsVision.Platform.WinForms"
)]
public class ExternalStorage : IBinaryStorage, IExtensionInitialize
В атрибуте Editor указываются:
  1. Полное название класса, в котором реализована графическая форма.

  2. Название и сборка класса IExtensionPropertiesControl, как в примере.

Если возможность настройки не требуется, то атрибут Editor не указывается.