Особенности создания объектов в сценариях
Создание объектов в сценариях довольно частая операция, и необходимо понимать ее особенности.
Возможны 2 способа создания объекта в сценарии:
- Через специальные методы инициализации объекта.
- Через конструктор объекта напрямую.
Рассмотрим каждый вариант отдельно и разъясним, как же все-таки правильно создавать объекты в сценарии.
Использование специальных методов инициализации объекта
Пример использования этих методов приведен ниже:
{
//Использование класса InterfaceActivator
var newContragent = EleWise.ELMA.Model.Services.InterfaceActivator.Create<ContractorLegal>();
newContragent.Name = "Контрагент 1";
//Использование метода менеджера Create
var newContragent2 = EntityManager<ContractorLegal>.Create();
newContragent2.Name = "Контрагент 2";
//Использование метода менеджера Create
var newContragent3 = EntityManager<ContractorLegal>.Instance.Create();
newContragent3.Name = "Контрагент 3";
//Использование класса синтаксис-помошника InstanceOf
var newContragent4 = new EleWise.ELMA.Services.InstanceOf<ContractorLegal>()
{
New = {
Name = "Контрагент 4"
}
}.New;
//Использование метода PublicAPI Create
var newContragent5 = PublicAPI.CRM.Contractor.ContractorLegal.Create();
newContragent5.Name = "Контрагент 5";
}
Теперь рассмотрим эти методы поближе.
Использование класса InterfaceActivator
Этот класс очень полезен во многих случаях: он позволяет разработчикам модулей создавать и использовать объекты в коде без привязки к конфигурации (по сути в коде модулей чаще всего используются интерфейсы расширений, а не классы объектов). Этот метод создает новый объект в памяти приложения и проводит его инициализацию при помощи различных точек расширения. Этот метод лежит в основе всех остальных, и его вызов является обязательным, если вы пишете модуль системы.
Использование метода менеджера Create
Следующие два объекта в примере создаются при помощи метода Create из менеджера объекта. Первый вариант - облегченный (укороченный) вызов второго варианта, т.е. фактической разницы между ними нет. Отличие этого метода от вызова метода класса InterfaceActivator в том, что метод менеджера может быть переопределен в самом менеджере объекта. Это точно может знать только разработчик объекта (если это системный объект, а не пользовательский справочник).
Использование класса InstanceOf
Этот метод больше служит для удобства разработчиков модулей, внутри он делает перевызов метода Create из класса InterfaceActivator. Использование этого класса просто облегчает в некоторых местах написание кода для разработчиков модулей.
Использование конструктора объектов
Данный метод используется как традиционный для создания объектов в платформе .NET
{
var newContragent = new ContractorLegal();
newContragent.Name = "Контрагент новый";
}
Т.е. имея класс объекта ContractorLegal мы просто создаем новый объект этого класса через оператор new.
Различия подходов
В обоих случаях, в сценарии создается объект системы, но он хранится только в памяти. Для сохранения в базу необходимо обязательно вызвать метод Save у самого объекта или у его менеджера (что по факту одно и то же).
Однако, если этот объект новый, как и есть в нашем случае, то при вызове метода Save происходит следующее:
- Делается вставка этого объекта в таблицу БД для того, чтобы получить очередной идентификатор.
- Полученный идентификатор присваивается в поле Id у нового объекта.
- После успешного завершения сценария эти данные фиксируются в базе (подтверждается транзакция БД).
Вот тут мы и должны понять разницу между этими двумя подходами, допустим у нас есть объект Запрос (Zapros) и у него поле Номер (Nomer) – пусть этот объект из дополнительного модуля и на поле Номер разработчики добавили проверку уникальности в базе данных. Но для инициализации этого поля разработчик обязан прописать в методе Create менеджера этого объекта логику, присваивающую этому полю уникальное значение.
И теперь, представим, что в сценариях вы попытаетесь создать такой объект через оператор new и сохранить, поскольку разработчик никак не может повлиять на стандартную инициализацию объекта через new, при попытке сохранить объект будет выдана ошибка уникального ключа в БД. Если же создавать такой объект через метод менеджера Create, то все будет в порядке, так как сам разработчик знает что инициализация объектов проходит этот метод.
Обработчики свойств объектов
Эту разницу особенно можно увидеть при использовании обработчиков свойств в объектах.
При создании объекта через new настроенные обработчики не будут применены, что может повлиять на логику сценария в целом.