Вопрос

Переопределение метода GenerateSequenseNumber

Пытаюсь переопределить метод 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)'". Вижу где это, но обойти что то не получается. Есть варианты?

Конечно есть вариант создать своё действие процесса, но но не интересен

Нравится

5 комментариев
Лучший ответ

Алексей, Вы забыли создать свой конструктор с параметром «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 и наследовался от созданного класса.

Показать все комментарии