パブリッシュ中にカスタム ユーザー設定を有効にするには、解決ステップ (カスタム リゾルバー内) でパブリッシュ ユーザーが何であるかを調べたいと考えています (つまり、パブリッシャー サービス用に構成されたユーザー アカウントではなく、パブリッシュ操作を開始したユーザーです)。
元の発行ユーザーを見つけるには、PublishTransaction オブジェクト (具体的には Creator プロパティ) にアクセスできる必要があります。このセッションはパブリッシャー サービスによって作成される (そしてサービス アカウントを提供する) ため、カスタム リゾルバー内のセッションから User プロパティを使用することはできません。
現在の PublishTransaction を見つけるために、Mihai は優れたハックを提供してくれました。本質的に; Engine オブジェクトを手に入れることができれば、コンテキスト パブリッシュ トランザクションを決定できます。
カスタム リゾルバでは、Resolve メソッドが 4 つのパラメータで呼び出されます。
public void Resolve(
IdentifiableObject item,
ResolveInstruction instruction,
PublishContext context,
ISet<ResolvedItem> resolvedItems
) { }
- このアイテムは、Session オブジェクトを提供するために使用できますが、IdentifiableObject も Session もエンジンへの参照を保持しません。
- 解決命令は、解決のためのデータ プロパティのセットにすぎません。
- パブリッシュ コンテキスト (残念ながら PublishingContext ではありません) は、パブリケーションとパブリケーション ターゲットのみを保持します。
- ResolvedItem はセッションへのアクセスを再度許可しますが、エンジンへのアクセスは許可しません。
私の質問は (最終的に) 2 つ
あります。
2. IResolver.Resolve() メソッドが呼び出されたパラメーターからエンジンを判別できる潜在的なポイントを見落としていませんか?
編集: 少し長い話になるため、追加のメタデータ (ユーザー設定から) を使用して公開アクティビティをカスタマイズする理由について、全体像を省略したことに気付きました。
最終的に必要なのは、コンポーネント テンプレート内の特定のバージョンのコンポーネントを有効にすることです (バージョン リストを調べて、専用のマーカー コンポーネントにリンクされているバージョンを見つけます)。マーカー成分です。このため、マーカー コンポーネントを公開し (リンクされたすべてのコンポーネントと最終的にページを解決します)、カスタム リゾルバーにより、マーカー コンポーネントの TCMURI をセッション キャッシュにプッシュできます (CT でアクセスできるようにします)。
ここで、ユーザー レベルで特定のマーカー コンポーネントの「設定」を設定して、このマーカー コンテキスト内でアセットの小さなバッチを公開できるようにします (マーカーにリンクされたすべてを一度に公開するのではなく)。
CT 内で実行されている TBB には実際に利用可能な Engine オブジェクトがあるため、Mihai の方法を使用して公開ユーザーを決定し (最初に行ったようにリゾルバーからマーカー コンテキストをプッシュするのではなく)、この方法で問題を完全に回避できます。
解決操作とレンダリング操作の間で情報の可用性にこのような違いがあるのはなぜだろうと思っていました。結局のところ、両方とも同じ公開コンテキストの一部です。非常に基本的なことを見落としているように感じずにはいられませんが、おそらくそうではなく、リゾルバーから公開コンテキストまたはエンジンにアクセスすることは単に不可能です。
編集:ドミニクが推定し、ヌノが確認したように、解決時に「エンジン」はありません。そのため、私の質問のこの半分は回答済みです。それは去る
(PublishTransaction 以外で) コンテキスト ユーザー アカウントを特定できる潜在的なポイントを見逃していませんか?