InfinniPlatform 1.11.0

Данный выпуск ориентирован на улучшение общей структуры проекта и стабилизацию существующего функционала. Основной целью при этом является выделение специфической и зависимой от окружения функциональности в отдельные пакеты, которые можно будет подключать в своем решении, если в этом есть необходимость. До настоящего момента большая часть функциональности платформы предоставлялась “из коробки” целиком и включалась в приложение даже в том случае, если в этом не было необходимости.

Редактор Print View

С учетом изменений был доработан редактор печатных представлений.

  • Добавлено отображение размера страницы в области предпросмотра.
  • Добавлена подсветка в области предпросмотра выделенного элемента в дереве.
  • Добавлена перекрестная навигация между областью предпросмотра и деревом (контекстное меню).
  • Добавлено контекстное меню для очистки редакторов свойств (Size, Border, Margin, Padding).
  • Добавлена возможность осуществлять одновременный предпросмотр в PDF и HTML.
  • Добавлена возможность использовать тестовый набор данных для предпросмотра.

Static Content

Появилась возможность хостинга встроенных ресурсов приложения. Это позволит, например, хранить файлы представлений не в отдельных файлах на диске, а в соответствующей сборке (Embedded Resource). Подробнее о настройке см. статью “Хостинг статического контента”.

InfinniPlatform.Watcher

Расширение InfinniPlatform.Watcher перенесено в проект платформы в качестве пакета расширения. Теперь новые версии этого пакета будут выходить вместе с новыми версиями InfinniPlatform.

SerializerVisibleAttribute

Появился атрибут InfinniPlatform.Sdk.Serialization.SerializerVisibleAttribute, позволяющий добавлять в список сериализуемых членов типа закрытые поля и свойства. Например, вы можете запретить изменять значения определенного свойства в коде или сделать его недоступным на уровне пользователя вашего типа, используя модификаторы доступа private или internal, но при этом разрешить сериализацию этого свойства с помощью атрибута SerializerVisibleAttribute.

 public class Document
 {
     [SerializerVisible]
     public DocumentHeader _header { get; internal set; }

     // ...
 }

Пакеты аутентификации

До недавнего времени механизм аутентификации был неотъемлемой частью InfinniPlatform. Как показала практика, это решение не оправдало себя. Более того это требовало установки множества зависимостей, которые в большинстве случаев не использовались. По этой причине было принято решение реализовать механизм аутентификации в виде набора расширений, представленных в виде NuGet-пакетов. На данный момент реализованы следующие виды аутентификации:

  • InfinniPlatform.Auth.Cookie - аутентификация с помощью Cookie;
  • InfinniPlatform.Auth.Internal - аутентификация с помощью базы данных приложения;
  • InfinniPlatform.Auth.Google - аутентификация с помощью учетной записи Google;
  • InfinniPlatform.Auth.Facebook - аутентификация с помощью учетной записи Facebook;
  • InfinniPlatform.Auth.Vk - аутентификация с помощью учетной записи ВКонтакте;
  • InfinniPlatform.Auth.Adfs - аутентификация с помощью учетной записи ADFS.

Также есть возможность добавить свой способ аутентификации. Для этого нужно:

  • подключить в свое решение NuGet-пакет InfinniPlatform.Http;
  • реализовать интерфейс InfinniPlatform.Http.Middlewares.IHttpMiddleware с нужной логикой аутентификации;
  • зарегистрировать реализацию интерфейса в контейнере зависимостей.

Переименование

В целях улучшения структуры проекта часть типов была перенесена в другое пространство имен.

  • InfinniPlatform.Sdk.ServicesInfinniPlatform.Sdk.Http.Services
  • InfinniPlatform.Sdk.Metadata.DocumentsInfinniPlatform.Sdk.Documents.Metadata

ITenantScope

Добавлена концепция области работы с данными определенной организации InfinniPlatform.Sdk.Session.ITenantScope. Для ее использования достаточно получить зависимость InfinniPlatform.Sdk.Session.ITenantScopeProvider и определить границы области работы с помощью оператора using, как в примере ниже. Ранее доступ к данным организации осуществлялся на основе учетных данных пользователя и, таким образом, не было возможности выполнять какую-либо логику за пределами обработки запроса пользователя, кроме как напрямую обращаться к данным, минуя все высокоуровневые абстракции.

 ITenantScopeProvider scopeProvider;

 // ...

 using (scopeProvider.BeginTenantScope("<Your Tenant ID>"))
 {
     // Work with IDocumentStorage or IDocumentStorage<T>
 }

Также обеспечена поддержка выполнения асинхронных операций (async/await) внутри области (using).

Плагины к InfinniPlatform и Razor view engine

Введен новый тип NuGet-пакетов - Plugins. В отличии от пакетов-расширений (Extensions), плагины устанавливаются непосредственно в папку platform и расширяют возможности InfinniPlatform. Это изменение позволило уменьшить количество зависимостей ядра платформы.

Движок отображения Razor-представлений теперь исключен из ядра платформы и представляет собой отдельный пакет InfinniPlatform.Plugins.ViewEngine.

Команда Init

Добавлена команда Init в InfinniPlatform.ServiceHost.exe и Infinni.Node.exe. Выполняет логику инициализации приложения, реализованную в методе OnInit() интерфейса IAppEventHandler:

public class ExampleAppInitializer : AppEventHandler
{
    public override void OnInit()
    {
        // Declare initialization logic here...
    }
}

Позволяет выполнить тяжелые, требовательные ко времени выполнения операции, которые необходимо выполнить при первом старте приложения (инициализация БД, миграция данных и т.п.), без запускаа самого приложения. Команда поддерживается в утилитах Infinni.Node и InfinniPlatform.ServiceHost:

# Infinni.Node

# Выполнить `только` инициализацию приложения
Infinni.Node.exe init -i <AppName>

# InfinniPlatform.ServiceHost

# Выполнить `только` запуск приложения
InfinniPlatform.ServiceHost.exe
InfinniPlatform.ServiceHost.exe -s
InfinniPlatform.ServiceHost.exe --start

# Выполнить `только` инициализацию приложения
InfinniPlatform.ServiceHost.exe -i
InfinniPlatform.ServiceHost.exe --init

# Выполнить инициализацию, затем старт приложения
InfinniPlatform.ServiceHost.exe -i -s
InfinniPlatform.ServiceHost.exe --init --start

JSON-схемы конфигурационных файлов

В файлы конфигурации можно подключить JSON-схему, что позволяет использовать автодополнение в редакторах кода (например Visual Studio, Visual Studio Code), а также получать информацию о секциях, параметрах и их возможных значений. Схемы хранятся в репозитории InfinniPlatform. Для подключения, достаточно добавить в файл конфигурации поле $schema с адресом общей схемы (Common.json).

{
    "$schema": "https://raw.githubusercontent.com/InfinniPlatform/InfinniPlatform/master/Files/Config/Schema/Common.json",
    ...
}

Также схему можно расширить для прикладного проекта и подключать уже расширенный вариант, достаточно унаследоваться от общей схемы (Common.json), т.е. указать её в поле allOf (см. пример ниже):

{
    "id": "Custom.json",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "AppCustom",
    "description": "Custom application settings.",
    "allOf": [{
        "$ref": "https://raw.githubusercontent.com/InfinniPlatform/InfinniPlatform/master/Files/Config/Schema/Common.json"
    }],
    "properties": {
        "customProperty": {
        "type": "object",
        "description": "Some custom application setting."
        }
    }
}

Подробнее о JSON-схемах см. JSON schema и - Understanding JSON Schema.

Инструменты для администрирования приложений (Infinni.Agent + Infinni.Server)

Выпущены первые версии инструментов для администрирования приложений в кластере: Infinni.Agent и Infinni.Server.

Infinni.Agent - предоставляет REST API для обращения к утилите Infinni.Node.

Infinni.Server - предоставляет REST API, а также Web-интерфейс для обращения к экземплярам приложения Infinni.Agent, установленных на машинах в кластере.

Подробнее см. соответствующие главы документации: Infinni.Agent и про Infinni.Server.