Серверные расширения
Данный вид расширения может быть востребован при необходимости выполнения каких-то действий в контексте основного процесса сервера (с его привилегиями), которые не могут быть выполнены с использованием стандартных методов интерфейса сервера. Механизм расширений позволяет интегрировать в контекст сервера дополнительные методы, а также обеспечивает возможность их вызова с клиента через общую объектную модель (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\\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"); (1)
method.Parameters.AddNew("FilePath", ParameterValueType.String, ".\\Test.txt"); (2)
string content = method.Execute().ToString(); (3)
1 | Получаем метод расширения. Первым параметром указывается имя расширения, вторым — название метода. |
2 | Добавляем параметр вызываемого метода:
|
3 | Вызов метода |