Разработчик может описать Нумераторы не только в Модели Приложения, но и в коде. Такой подход позволяет существенно расширить область применения Нумераторов. Класс Нумератора должен являться наследником Xafari.BC.Numerators.CustomNumerator:

 

    public class CustomUpdaterNumerator : CustomNumerator

    {

        public CustomUpdaterNumerator()

        {

            this.Template = "Object_{0:<INDEX>,000}";

            this.StartValue = 1;

            this.Step = 1;

            this.ThroughNumeration = true;

            this.UseDeletedNumbers = false;

        }

    }

 

Эземпляр класса надо добавить в общий список Нумераторов. Затем следует добавить ссылки (Numerator Link), которые привязывают Нумератор к свойству персистентного типа.

 

            var numerator = new CustomUpdaterNumerator();

            NumeratorManager.Instance.AddNumerator(numerator);

            NumeratorManager.Instance.AddLink(new NumeratorLink(numerator, typeof(DateNumerator), "Number"nulltrue));

 

Сервис Нумераторов обеспечивает различные сценарии использования.

  1. Любые операции с Нумераторами синхронно отражаются в БД. Этот сценарий реализуется использованием «старых» методов API.
  2. Операции с Нумераторами производятся в отдельном IObjectSpace. Отражение в БД всех изменений в сервисе производится после выполнения CommitChanges() этого IObjectSpace.
  3. Рекомендуется. Операции с Нумераторами производятся в том же IObjectSpace, что и нумеруемые объекты. Отражение в БД всех изменений в сервисе производится после выполнения CommitChanges() общего IObjectSpace.

 

        private void simpleAction1_Execute(object sender, SimpleActionExecuteEventArgs e)

        {

            #region Scenario Same ObjectSpace

 

            // apply numenrators now

            this.ObjectSpace.ApplyNumerators(this.View.CurrentObject, ApplyNumeratorsStrategy.AfterCreate);

            // apply numerators on save

            this.ObjectSpace.ApplyNumerators(this.View.CurrentObject);

            // apply all delayed numerators

            this.ObjectSpace.CommitChanges();

 

            #endregion

 

            #region Scenario Own ObjectSpace

            using (var objectSpace = this.Application.CreateObjectSpace())

            {

                // apply numenrators now

                objectSpace.ApplyNumerators(this.View.CurrentObject, ApplyNumeratorsStrategy.AfterCreate);

                // apply numerators on save

                objectSpace.ApplyNumerators(this.View.CurrentObject);

                // apply all delayed numerators, CurrentObject not commited

                objectSpace.CommitChanges();

 

                // rollback all numerator operations

                objectSpace.RollbackNumerators(this.View.CurrentObject);

            }

            #endregion

        }

 

Минимизированы обращения к БД при пакетной нумерации объектов.