我编写了一个类来帮助使用核心服务向发布目标添加和删除目标。目的地通常通过核心服务作为字符串(带有 XML 内容)公开,所以我围绕它编写了自己的包装器,等等。
我现在有一种情况,我需要更新 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);
}
但这并没有什么不同。有没有办法确定我当前是否正在进行交易并以某种方式“使用”该交易?我不想要求交易,只想有一个操作的选项。
谢谢,很抱歉发了很长的帖子……想确保我提供了尽可能多的信息。