2016-09-07 5 views
0

Обработчики контента, разрешенные Autofac, возвращаются в непредсказуемом порядке. Мне нужно, чтобы некоторые обработчики содержимого вызывались в определенном порядке.Orchard CMS - Как указать порядок вызовов обработчиков содержимого?

Пример:

оснащены

Содержимое обработчика А -> назначает/удаляет роль X из элемента контента пользователя

Feature B

Content обработчика B -> оценивает назначенные роли и когда роль X находится в ней и предпринимает дальнейшие действия

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

В настоящее время Autofac решает обработчик в упорядочении следующего

..., A, B, ... 

но обработчики хранятся в списке обработчиков в следующем порядке

... B, A, ... 

Затем Orchard вызывает обработчики как

Handlers.Invoke(handler => ..., Logger); 

, который, очевидно, вызывает обработчики в порядке

... B, A, ... 

Есть ли что-нибудь, что я могу сделать для обеспечения определенного заказа?

Вот обсуждение в Google группах о подобной проблеме:

https://groups.google.com/forum/#!topic/autofac/HE66utFpvkg

ответ

2

Вы никогда не должны полагаться на порядок обработчиков контента. Если вам нужно запустить код в определенном порядке, вы можете определить свой собственный интерфейс обработчика с свойством для заказа ваших обработчиков. Например:

public interface IMyHandler { 
    int Priority { get; } 
    void Invoke(ContentItem item); 
} 

Вы можете зарегистрировать этот интерфейс с помощью специального модуля Autofac внутри вашего модуля Orchard. Затем внутри обычного обработчика содержимого вы можете ввести IEnumerable<IMyHandler>. Это предоставит вам все зарегистрированные обработчики типа IMyHandler. Затем вы можете заказать их по Priority и вызвать их в цикле foreach.

foreach (var handler in _myHandlers.OrderBy(x => x.Priority)) { 
    handler.Invoke(item); 
}