У меня есть пользовательский Резольвер настроен на 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 до разрешения по умолчанию, и если вы не можете предложить эффективный способ достижения такого же поведения, как старый обработчик событий?
Спасибо, Барт. Хотя это и не объясняет, почему мой резольвер никогда не называется. Вы случайно не знаете, какую подпись должен реализовать мой резольвер, если он помещен первым в порядке распознавателей? У меня в настоящее время есть: public void Resolve (IdentifiableObject item, ResolveInstruction инструкция, контекст PublishContext, ISet resolvedItems) –
Решатели вызывается в том порядке, в котором они определены в Tridion.ContentManager.файл конфигурации. Подпись и порядок, в которых вызываются преобразователи, не зависят друг от друга. Но, как говорит Барт, реалистично вы должны сначала оставить дефолты по умолчанию и просто добавить свои собственные после него. –
Итак, если их можно разместить в любом порядке (независимо от того, является ли это лучшей практикой), и мой рабочий резольвер не вызывается, когда он помещен первым, должен ли я сообщить об этом как о дефекте? –