Пытаюсь переопределить метод 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
///
/// Represents user task to generate ordinal number.
///
public class NavGenerateSequenseNumber : GenerateSequenseNumberUserTask
{
#region Methods: Public
///
/// Returns sequence number.
///
/// Entity schema.
/// User connection.
/// String that represents a generated sequence number.
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 и наследовался от созданного класса.