Серверные расширения
Данный вид расширения может быть востребован при необходимости выполнения каких-то действий в контексте основного процесса сервера (с его привилегиями), которые не могут быть выполнены с использованием стандартных методов интерфейса сервера. Механизм расширений позволяет интегрировать в контекст сервера дополнительные методы, а также обеспечивает возможность их вызова с клиента через общую объектную модель (ObjectManager).
Серверное расширение представляет собой .NET сборку (Class Library), в которой должен быть реализован как минимум один класс, унаследованный от DocsVision.Platform.StorageServer.Extensibility.StorageServerExtension
.
Этот базовый класс уже содержит в себе всю необходимую инфраструктуру для реализации модуля расширения. Разработчику остается только определить сигнатуру методов, реализуемых данным модулем расширения. Такие методы необходимо пометить специальным атрибутом: ExtensionMethod
.
Атрибут |
Пример кода реализации серверного расширения, где метод GetBaseName возвращает имя рабочей базы данных:
using System;
using System.IO;
using DocsVision.Platform.StorageServer.Methods;
using DocsVision.Platform.StorageServer.Extensibility;
namespace DocsVision.Samples
{
public sealed class SampleExtension : StorageServerExtension
{
public SampleExtension(){ }
[ExtensionMethod]
public string GetBaseName()
{
return this.Request.Base.Name;
}
}
}
В качестве возвращаемого значения метод может вернуть либо скаляр, либо набор данных (коллекцию). Во втором случае лучше воспользоваться специальным типом возвращаемого значения — DocsVision.Platform.StorageServer.CursorInfo
. Этот объект позволяет создать серверный курсор, из которого потом можно читать данные на клиенте.
Объект CursorInfo можно создать двумя способами:
-
с помощью метода GetCursorBuilder, который возвращает объект CursorBuilder и позволяет программно заполнять серверный курсор.
-
с помощью метода ExecuteCursorCommand, который выполняет SQL-команду, сохраняет её результаты в курсоре, и возвращает готовый CursorInfo.
Пример реализации серверного метода, возвращающего набор значений:
[ExtensionMethod]
public CursorInfo GetSectionsSize()
{
using (DatabaseCommand Command = base.DbRequest.DataLayer.Connection.CreateCommand("dvsys_help_show_section_size", CommandType.StoredProcedure))
{
return base.ExecuteCursorCommand(Command);
}
}
Готовый модуль расширения необходимо зарегистрировать на сервере. Для этого нужно в ветке реестра [HKEY_LOCAL_MACHINE\SOFTWARE\DocsVision\Platform\5.5\Server\Extensions]
создать строковое значение с названием расширения (любое уникальное, на латинице, без пробелов и спец. знаков) и значением, представляющим полное имя класса, реализующего интерфейс расширения, к примеру:
"BackOfficeExtension"="DocsVision.BackOffice.ServerExtension.Extension, DocsVision.BackOffice.ServerExtension, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7148afe997f90519"
Для вызова методов модуля расширения на клиенте необходимо воспользоваться специальным объектом — менеджером расширений (ExtensionManager
). Менеджер расширений содержит метод для вызова у указанного расширения определённого метода: GetExtensionMethod
.
Если такого расширения или метода на сервере не зарегистрировано, функция вернет ошибку. В противном случае будет возвращен специальный объект — ExtensionMethod
, с помощью которого уже можно выполнять непосредственные вызовы метода серверного расширения.
Параметры вызова серверного метода задаются через коллекцию Parameters, в которую их необходимо явно добавить в виде объектов ExtensionMethodParameter
. Этот объект очень прост — он описывает название, тип и значение параметра через одноименные свойства.
Пример кода вызова метода серверного расширения:
//Получаем метод расширения
// Первым параметром указывается имя расширения, вторым -- название метода
ExtensionMethod method = session.ExtensionManager.GetExtensionMethod("BackOfficeExtension", "GetFileContent");
// Добавляем параметр вызываемого метода
// первый аргумент -- название параметра метода
// второй -- тип параметра
// третий -- значение параметра
method.Parameters.AddNew("FilePath", ParameterValueType.String, "C:\\Test.txt");
//Вызов метода
string content = method.Execute().ToString();