2012-03-27 2 views
4

У меня есть пользовательский Резольвер настроен на SDL Tridion 2011, который предназначен для предотвращения страниц и компоненты которые используют мультимедиа компонента от публикуются, когда пользователь публикует связанный Мультимедийный компонент. Этот заказ Резольвер заменяет старый обработчик события, который выглядит следующим образом:Управления порядка 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() 

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

ответ

5

Мы открыли запрос на инцидент для поддержки SDL Tridion. Здесь Вы можете найти их ответ:

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

3

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

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

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

+1

Спасибо, Барт. Хотя это и не объясняет, почему мой резольвер никогда не называется. Вы случайно не знаете, какую подпись должен реализовать мой резольвер, если он помещен первым в порядке распознавателей? У меня в настоящее время есть: public void Resolve (IdentifiableObject item, ResolveInstruction инструкция, контекст PublishContext, ISet resolvedItems) –

+1

Решатели вызывается в том порядке, в котором они определены в Tridion.ContentManager.файл конфигурации. Подпись и порядок, в которых вызываются преобразователи, не зависят друг от друга. Но, как говорит Барт, реалистично вы должны сначала оставить дефолты по умолчанию и просто добавить свои собственные после него. –

+1

Итак, если их можно разместить в любом порядке (независимо от того, является ли это лучшей практикой), и мой рабочий резольвер не вызывается, когда он помещен первым, должен ли я сообщить об этом как о дефекте? –

Смежные вопросы