Пытаюсь переопределить метод GenerateSequenseNumber(EntitySchema entitySchema, UserConnection connection), дописав в него свою логику.
Создал схему с исходным кодом
namespace Terrasoft.Core.Process.Configuration { using System; using Terrasoft.Common; using Terrasoft.Core; using Terrasoft.Core.DB; using Terrasoft.Core.Entities; using Terrasoft.Core.Process; using CoreSysSettings = Terrasoft.Core.Configuration.SysSettings; #region Class: NavGenerateSequenseNumber /// <summary> /// Represents user task to generate ordinal number. /// </summary> public class NavGenerateSequenseNumber : GenerateSequenseNumberUserTask { #region Methods: Public /// <summary> /// Returns sequence number. /// </summary> /// <param name="entitySchema">Entity schema.</param> /// <param name="connection">User connection.</param> /// <returns>String that represents a generated sequence number.</returns> public override string GenerateSequenseNumber(EntitySchema entitySchema, UserConnection connection) { string mycode = base.GenerateSequenseNumber(entitySchema, connection) +"MyCode"; return mycode; } #endregion } #endregion }
вроде бы все должно работать, но при компиляции получаю "There is no argument given that corresponds to the required formal parametr 'userConnection' of 'GenerateSequenseNumberUserTask.GenerateSequenseNumberUserTask(UserConnection)'". Вижу где это, но обойти что то не получается. Есть варианты?
Конечно есть вариант создать своё действие процесса, но но не интересен
Нравится
Алексей, Вы забыли создать свой конструктор с параметром «userConnection», который вызывает базовый из ядерного класса ProcessUserTask.
Подробнее о такой ошибке см. эту тему.
Попробуйте в начале класса перед методами ещё:
#region Constructors: Public public NavGenerateSequenseNumber(UserConnection userConnection) : base(userConnection) { SchemaUId = new Guid("308a276d-4de2-474b-9061-fd0b2ce6dc8a"); } #endregion
Тут я подставил UId своей новой схемы, но нужно смотреть, как правильнее при Вашем использовании. По крайней мере, скомпилировалось. Возможно, надо будет вызывать напрямую конструктор ProcessUserTask, поскольку в конструкторе GenerateSequenseNumberUserTask тоже прописывают UId:
#region Constructors: Public public GenerateSequenseNumberUserTask(UserConnection userConnection) : base(userConnection) { SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666"); } #endregion
Алексей, Вы забыли создать свой конструктор с параметром «userConnection», который вызывает базовый из ядерного класса ProcessUserTask.
Подробнее о такой ошибке см. эту тему.
Попробуйте в начале класса перед методами ещё:
#region Constructors: Public public NavGenerateSequenseNumber(UserConnection userConnection) : base(userConnection) { SchemaUId = new Guid("308a276d-4de2-474b-9061-fd0b2ce6dc8a"); } #endregion
Тут я подставил UId своей новой схемы, но нужно смотреть, как правильнее при Вашем использовании. По крайней мере, скомпилировалось. Возможно, надо будет вызывать напрямую конструктор ProcessUserTask, поскольку в конструкторе GenerateSequenseNumberUserTask тоже прописывают UId:
#region Constructors: Public public GenerateSequenseNumberUserTask(UserConnection userConnection) : base(userConnection) { SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666"); } #endregion
Вот меня собственно и смутило только значение Guid в SchemaUId. Указал такой же, что и в GenerateSequenseNumberUserTask, основываясь на логике, что это UId действия процесса сгенерировать номер по порядку. Его то я не меняю, меняю только метод генерации кода. Все сгенерировалось и работает как надо.
Скомпилироваться удалось, но ничего не работает ))))
Пробовал вариант и
#region Constructors: Public public NavGenerateSequenseNumber(UserConnection userConnection) : base(userConnection) { SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666"); } #endregion
и
#region Constructors: Public public NavGenerateSequenseNumber(UserConnection userConnection) : base(userConnection) { SchemaUId = base.SchemaUId; } #endregion
Результат один. Приложение компилируется, но переопределенный метод не вызывается. В шаблон заложил 2 параметра что то типа "{1:yy}-{0:00000}" и в форматирование номера добавил
string.Format(sysSettingsCodeMask, sysSettingsLastNumber, DateTime.Now);
Но в итоге получаю ошибку
System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) at Terrasoft.Configuration.SysSettingsService.SysSettingsService.GetIncrementValueVsMask(String sysSettingName, String sysSettingMaskName) at SyncInvokeGetIncrementValueVsMask(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Что говорит что мой метод не вызывается. Сгенерировать все, компилировать все, чистка Redis и перезапуск приложения - все делал)
Здравствуйте!
При выполнении процессов экземпляр класса элемента при его выполнении создается только для его класса (не через ClassFactory или другими словами только для класса элемента, а не для последнего класса по иерархии). То есть Ваш класс не вызывается из-за того, что не создается его экземпляр.
Реализовано все верно, только проблема в том, что Вы не создаете экземпляр своего класса. Поэтому единственный верный вариант - это создание своего UserTask и в последующем вызывать именно его.
Так же рекомендую вынести общую логику в source schema и наследовался от созданного класса.