Вопрос

Переопределение событийного процесса

Добрый день, имеется объект Product в пользовательском пакете. Он наследуется от Product (base). Также в пакете ProductCatalogue тоже содержится Product, у которого определён эвент на после сохранения. Подскажите, как можно переопределить этот эвент.

Нравится

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

Никак. Сначала срабатывает ваша логика после сохранения, потом вся родительская логика в объекте. Используйте свои поля и пишите к ним свою логику.

Никак. Сначала срабатывает ваша логика после сохранения, потом вся родительская логика в объекте. Используйте свои поля и пишите к ним свою логику.

Полозюков Евгений Петрович,

Дело в том, что Product из ProductCatalogue вносит нежелательную логику после сохранения продукта в пользовательском пакете. 

Пробовал переопределить OnSaved, но в данный метод поток даже не заходит.

    [EntityEventListener(SchemaName = "Product")]
    public class UsrProductEntityEventListener : BaseEntityEventListener
    {
        public override void OnSaved(object sender, EntityAfterEventArgs e)
        {
            var entity = (Entity)sender;
            var currencyColumn = entity.Schema.Columns.GetByName("Currency");
            var currencyId = entity.GetTypedColumnValue<Guid>(currencyColumn);
 
            if(currencyId == Guid.Empty)
                return;
 
            var taxColumn = entity.Schema.Columns.GetByName("Tax");
            var TaxId = entity.GetTypedColumnValue<Guid>(taxColumn);
 
            if(TaxId == Guid.Empty)
                return;
 
            base.OnSaved(sender, e);
        }
    }

 

Илья Белов,

Вы не можете переопределить логику которая в родителях продукта.

Полозюков Евгений Петрович,

Я понимаю, теперь я пытаюсь вызвать метод на событие ProductSaved.

Но в автогенерируемом файле, в методе ProcessQueue очередь всегда пустая и следовательно мой SetPrices никогда не выполнится. Однако, в Product из ProductCatalogue метод SetPrices вызывается. Я не очень понимаю, мой пакет не зависит от Product из ProductCatalogue, более того в моём пакете создан свой замещающий объект Product. Моя очередь событий в ProcessQueue пустая, а в Product из ProductCatalogue нет.

protected override bool ProcessQueue(ProcessExecutingContext context) {
	bool result = base.ProcessQueue(context);
	if (context.QueueTasks.Count == 0) {
		return result;
	}
	switch (context.QueueTasks.Peek()) {
		case "EventSubProcess1":
			context.QueueTasks.Dequeue();
			break;
		case "ProductSaved":
			context.QueueTasks.Dequeue();
			context.SenderName = "ProductSaved";
			result = ProductSaved.Execute(context);
			break;
		case "SetPrices":
			context.QueueTasks.Dequeue();
			context.SenderName = "SetPrices";
			result = SetPrices.Execute(context, SetPricesExecute);
			break;
	}
	if (!result && context.QueueTasks.Count > 0) {
		ProcessQueue(context);
	}
	return result;
}

 

Илья Белов,

Думаю, дело не в зависимости пакетов, а в зависимости + порядке замещения. Даже если ваш пакет и не зависит, всё равно вызовется логика из всех пакетов, вашему "не повезло", похоже, он обрабатывается позже, а у родителя есть одноименная обработка. Так что лучше делать уникальные имена в событийном подпроцессе.

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