私はコアサービスを使用して&のパブリケーションターゲットへの宛先の追加を支援するクラスを作成しました。宛先は通常、コアサービスを介して文字列として(XMLコンテンツを使用して)公開されています。そのため、自分自身でラッパーを作成しました。CoreServiceを使用してカスタムクラスでWCFトランザクションサポートを実装するにはどうすればよいですか?
ここで、2つの出版ターゲットを更新する必要があると思いますクールなトランザクションスコープを使用して、両方のターゲットが同時に更新されるようにします。
しかし、私はこれを実装することに苦労しています。
(標準CoreService WCFクライアントを使用して)作業コード:
TransactionOptions txOptions = new TransactionOptions
{ IsolationLevel = IsolationLevel.ReadCommitted };
using(TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required, txOptions))
{
PublicationTargetData publicationTarget1 = (PublicationTargetData)client.Read("tcm:0-1-65537", readOptions);
PublicationTargetData publicationTarget2 = (PublicationTargetData)client.Read("tcm:0-2-65537", readOptions);
publicationTarget1.TargetLanguage = "JSP";
publicationTarget2.TargetLanguage = "JSP";
client.Save(publicationTarget1, readOptions);
client.Save(publicationTarget2, readOptions);
// Stop saving
scope.Dispose();
}
はこのコードを実行すると、正常私はscope.Dispose()
前に破るとTridionので出版目標を確認した場合、それが正常にターゲットを変更する(私は変更をロールバックします変更を元に戻します)。
私は現在、「拡張された出版物ターゲット」クラスをトランザクションでも使用しようとすると、それを処分できません。
TransactionOptions options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
ExtendedPublicationTarget target1 = new ExtendedPublicationTarget("tcm:0-1-65537");
ExtendedPublicationTarget target2 = new ExtendedPublicationTarget("tcm:0-2-65537");
target1.Destinations.Add(target1.Destinations[0]);
target2.Destinations.Add(target2.Destinations[0]);
target1.Save();
target2.Save();
scope.Dispose();
}
これは基本的に、これが問題です。私の.Save()メソッドにトランザクション性を追加するにはどうすればよいですか?私はこれをやって試してみました
:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
public void Save()
{
_client.Save(targetData, readOptions);
}
しかし、それは違いはありませんでした。私が現在取引中で、どういうわけかその取引を「使用する」かどうかを判断する方法はありますか?私はトランザクションを必要としたくないだけで、1つのオプションで操作する必要があります。
非常に長い投稿を申し訳ありません...できるだけ多くの情報を提供していることを確認したかったのです。
'scope'変数は' using'節にあるので、明示的に 'Dispose'を呼び出すべきではありません。代わりに 'using'ブロックが終了すると自動的に処理されます。 –
あなたは「私はそれを決めることはできない」と言います。どういう意味ですか?コンパイラエラーが出ますか?例外?あるいは、コードはあなたの目標を更新しないだけですか? (PS:もし私が慣れていた通りにWCFトランザクションの名前が付けられていれば、TransactionScopeは既存のトランザクションに「ピギーバック」するか、新しいトランザクションを開始するでしょうが、WCFトランザクションに関する経験がないので、他の誰かがその仮定を確認/訂正するのを見てください)。 –
こんにちはフランク、私はそれを失敗させるため、私のscope.Dispose()呼び出しをしようとしています。最初の例では正しく失敗し、2番目の例では失敗します。ちょうど私がそれを動作させるために私のクラスに追加する必要があることを理解しようとしています... –