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