2016-09-07 15 views
0

Autofacで解決されたコンテンツハンドラは、予期しない順序で返されます。私はいくつかのコンテンツハンドラが特定の順序で呼び出される必要があります。オーチャードCMS - コンテンツハンドラの呼び出し順序を指定する方法は?

例:

機能

コンテンツハンドラA - >割り当て/ユーザコンテンツアイテムからロールXを除去

特徴B

コンテンツハンドラB - >割り当てられた役割を評価し、役割Xがそれを見つけてさらなる行動を取るとき

私の場合は、Aの前にハンドラBを呼び出すのは意味がありません.AのロールXを更新しなければならない前に、BはロールXの割り当てに基づいてさらにアクションを実行することもできます。

..., A, B, ... 

を次のように

現在Autofacが順序でハンドラを解決しますが、ハンドラは、次の順序

... B, A, ... 

にハンドラリストに格納されてその後オーチャードは

のようなハンドラを呼び出します
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); 
} 

Orchardモジュール内にカスタムAutofacモジュールを登録することができます。その後、通常のコンテンツハンドラの内部にIEnumerable<IMyHandler>を挿入することができます。これにより、IMyHandlerタイプの登録ハンドラがすべて提供されます。その後、Priorityで注文し、foreachループで呼び出すことができます。

foreach (var handler in _myHandlers.OrderBy(x => x.Priority)) { 
    handler.Invoke(item); 
} 
関連する問題