Управление порядком пользовательских резольверов SDL Tridion 2011 - PullRequest
4 голосов
/ 27 марта 2012

У меня есть настраиваемый резолвер, настроенный для SDL Tridion 2011, который предназначен для предотвращения публикации страниц и компонентов , использующих мультимедийный компонент , когда пользовательпубликует связанный мультимедийный компонент .Этот пользовательский резолвер заменяет старый обработчик событий, который выглядел следующим образом:

private void MMCmpPublishHandler(Component source, PublishEventArgs args, 
                                 EventPhases phase)
{
    if (source.ComponentType == ComponentType.Multimedia)
    {
        args.PublishInstruction.ResolveInstruction.IncludeComponentLinks = false;
    }
}

Старый обработчик событий вызывался до вызова распознавателей.Я настроил мой новый распознаватель так, чтобы он запускался после задания по умолчанию распознавателя, настроив мой файл Tridion.ContentManager.config со следующим извлечением:

<add itemType="Tridion.ContentManager.ContentManagement.Component">
    <resolvers>
        <add type="Tridion.ContentManager.Publishing.Resolving.ComponentResolver" assembly="Tridion.ContentManager.Publishing, Version=6.1.0.996, Culture=neutral, PublicKeyToken=360aac4d3354074b"/>
        <add type="UrbanCherry.Net.SDLTridion.CustomResolvers.DynamicBinaryLinkResolver" assembly="UrbanCherry.Net.SDLTridion.CustomResolvers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e7729a00ff9574fb"/>
    </resolvers>
</add>

Код работает нормально, хотя он кажется противоинтуитивным (из представленияв перспективе), чтобы разместить новый распознаватель после распознавателя по умолчанию, так как распознаватель по умолчанию требует времени, чтобы найти все разрешенные элементы, только чтобы все они были удалены снова.

Я попытался изменить порядок распознавателей, чтобы новый распознавательсначала вызывается, но новый распознаватель никогда не вызывается, и в журнале событий появляется следующая ошибка:

Object reference not set to an instance of an object.


Component: Tridion.ContentManager.Publishing
Errorcode: 0
User: NT AUTHORITY\SYSTEM

StackTrace Information Details:
   at Tridion.ContentManager.Publishing.Resolving.ResolveEngine.ResolveItems(IEnumerable`1 items, ResolveInstruction instruction, IEnumerable`1 contexts)
   at Tridion.ContentManager.Publishing.Resolving.ResolveEngine.ResolveItem(IdentifiableObject item, ResolveInstruction instruction, PublishContext context)
   at Tridion.ContentManager.Publishing.Handling.DefaultPublishTransactionHandler.HandlePublishRequest(PublishTransaction publishTransaction)
   at Tridion.ContentManager.Publishing.Handling.DefaultPublishTransactionHandler.ProcessPublishTransaction(PublishTransaction publishTransaction)
   at Tridion.ContentManager.Publishing.Publisher.QueueMessageHandler.HandleMessage()

Кто-нибудь знает, возможно ли вызвать пользовательский преобразователь перед преобразователем по умолчанию, и еслиНе можете ли вы предложить эффективный способ достижения того же поведения, что и старый обработчик событий?

Ответы [ 2 ]

5 голосов
/ 08 ноября 2012

Мы открыли запрос на инцидент для поддержки Tridion SDL. Пожалуйста, найдите ниже их ответ:

Отдел исследований и разработок подтвердил, что обнаруженная вами проблема является дефект, начинающийся с перехода на SP1. Теперь больше нельзя разместить пользовательский распознаватель перед распознавателем по умолчанию. ожидается, что проблема будет решена в будущем выпуске.

3 голосов
/ 27 марта 2012

Конечно, сначала можно вызвать ваш распознаватель, однако он понадобится вам для создания начального списка разрешенных элементов. Так как это в основном то, что уже делает распознаватель по умолчанию, не имеет смысла пытаться добавить свой перед ним в моем уме.

Так что да, с точки зрения производительности, было бы более целесообразно иметь только ваш распознаватель и заменить его по умолчанию. Но тогда вам действительно нужно декомпилировать файл по умолчанию и переписать его с вашей логикой. Что непродуктивно, конечно, учитывая, что исправления и обновления могут означать, что ваш код решателя может измениться в будущем.

Я обнаружил, что распознаватели на самом деле настолько быстрые, что я проигнорировал влияние на производительность удаления нескольких нужных мне элементов. Реально это только добавление элементов в список, а затем вы снова удаляете некоторые из этих элементов из списка.

...