Добрый день, имеется объект Product в пользовательском пакете. Он наследуется от Product (base). Также в пакете ProductCatalogue тоже содержится Product, у которого определён эвент на после сохранения. Подскажите, как можно переопределить этот эвент.
Нравится
Никак. Сначала срабатывает ваша логика после сохранения, потом вся родительская логика в объекте. Используйте свои поля и пишите к ним свою логику.
Никак. Сначала срабатывает ваша логика после сохранения, потом вся родительская логика в объекте. Используйте свои поля и пишите к ним свою логику.
Полозюков Евгений Петрович,
Дело в том, что 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; }
Илья Белов,
Думаю, дело не в зависимости пакетов, а в зависимости + порядке замещения. Даже если ваш пакет и не зависит, всё равно вызовется логика из всех пакетов, вашему "не повезло", похоже, он обрабатывается позже, а у родителя есть одноименная обработка. Так что лучше делать уникальные имена в событийном подпроцессе.