InfinniPlatform 1.11.0¶
Данный выпуск ориентирован на улучшение общей структуры проекта и стабилизацию существующего функционала. Основной целью при этом является выделение специфической и зависимой от окружения функциональности в отдельные пакеты, которые можно будет подключать в своем решении, если в этом есть необходимость. До настоящего момента большая часть функциональности платформы предоставлялась “из коробки” целиком и включалась в приложение даже в том случае, если в этом не было необходимости.
Print View¶
Механизм печатных представлений был исключен из стандартного функционала InfinniPlatform и теперь предоставляется в виде
отдельного NuGet-пакета InfinniPlatform.PrintView
. Теперь, чтобы добавить функциональность печатных представлений в свой проект, необходимо установить
данный пакет, выполнив следующую команду в Package Manager Console.
PM> Install-Package InfinniPlatform.PrintView
В связи с указанными изменениями ранее используемый интерфейс InfinniPlatform.Sdk.PrintView.IPrintViewApi
был удален. Вместо него следует использовать
InfinniPlatform.PrintView.Contract.IPrintViewBuilder
, определенный в пакете InfinniPlatform.PrintView
. Новая функциональность не требует от
разработчика хранения шаблонов печатных представлений в определенном каталоге на диске. Теперь шаблон печатного представления можно хранить где угодно,
например, в ресурсах самого приложения.
IPrintViewBuilder printViewBuilder;
...
// Поток для записи печатного представления
Stream printView;
// Данные печатного представления
object dataSource;
// Сборка, содержащая в ресурсах шаблон печатного представления
Assembly resourceAssembly;
...
// Получение шаблона печатного представления по имени ресурса
Func<Stream> template = () => resourceAssembly.GetManifestResourceStream("<PRINT VIEW RESOURCE>");
// Создание печатного представления по шаблону и данным
await printViewBuilder.Build(printView, template, dataSource, PrintViewFileFormat.Pdf);
Для оптимизации работы HTTP-обработчиков, результатом работы которых являются печатные представления, был добавлен класс
InfinniPlatform.PrintView.Contract.PrintViewHttpResponse
. Благодаря этому формируемое представление сразу выводится в выходной поток запроса,
минимизируя время ожидания ответа и потребление памяти на сервере (по сравнению с предыдущей реализацией).
IPrintViewBuilder printViewBuilder;
...
// Шаблон печатного представления
Func<Stream> template;
// Данные печатного представления
object dataSource;
...
// HTTP-ответ с печатным представлением
var response = new PrintViewHttpResponse(printViewBuilder, template, dataSource);
Редактор 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.Services
→InfinniPlatform.Sdk.Http.Services
InfinniPlatform.Sdk.Metadata.Documents
→InfinniPlatform.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
.