Tôi đã viết một lớp để hỗ trợ thêm & xóa đích đến mục tiêu xuất bản bằng dịch vụ cốt lõi. Các điểm đến thường được hiển thị dưới dạng một chuỗi (có nội dung XML) thông qua Dịch vụ cốt lõi, vì vậy tôi đã viết các trình bao bọc riêng của mình xung quanh đó, v.v.Làm cách nào để triển khai hỗ trợ Giao dịch WCF trên lớp tùy chỉnh bằng cách sử dụng CoreService?
Hiện tại tôi cần cập nhật 2 mục tiêu xuất bản và nghĩ rằng nó sẽ là mát mẻ để sử dụng phạm vi giao dịch để đảm bảo rằng cả hai mục tiêu đều được cập nhật cùng một lúc.
Tuy nhiên, tôi đang đấu tranh với việc thực hiện điều này.
Mã làm việc (sử dụng tiêu chuẩn CoreService WCF client):
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();
}
Thực thi mã này thành công sẽ quay trở lại các thay đổi mà tôi đã làm (nếu tôi phá vỡ trước scope.Dispose()
và kiểm tra các chỉ tiêu công bố trên Tridion nó thay đổi thành công mục tiêu và sau đó "hoàn tác" thay đổi).
Nếu bây giờ tôi cố gắng sử dụng lớp "Mục tiêu xuất bản mở rộng" của tôi cũng trong Giao dịch, tôi không thể hủy bỏ nó.
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();
}
Vì vậy, về cơ bản, đây là câu hỏi: Tôi phải làm gì để thêm giao dịch vào phương thức .Save() của tôi?
Tôi đã cố gắng làm điều này:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
public void Save()
{
_client.Save(targetData, readOptions);
}
Nhưng nó không tạo sự khác biệt. Có cách nào để xác định xem tôi hiện đang trong giao dịch hay không và bằng cách nào đó "sử dụng" giao dịch đó? Tôi không muốn yêu cầu một giao dịch, chỉ muốn có tùy chọn để hoạt động trong một giao dịch.
Cảm ơn và xin lỗi vì bài đăng rất dài ... muốn đảm bảo rằng tôi đã cung cấp càng nhiều thông tin càng tốt.
Vì bạn có biến 'scope' trong mệnh đề' using', bạn không nên gọi 'Dispose' trên nó một cách rõ ràng. Thay vào đó, nó sẽ tự động được xử lý khi khối 'using' kết thúc. –
Bạn nói "Tôi không thể nhúng nó". Điều đó nghĩa là gì? Bạn có gặp lỗi biên dịch không? Một ngoại lệ? Hay mã không cập nhật các mục tiêu của bạn? (PS: nếu WCF giao dịch được đặt tên theo những gì tôi đang sử dụng để, một TransactionScope sẽ hoặc là "piggy back" trên một giao dịch hiện có hoặc bắt đầu một cái mới. Nhưng kể từ khi tôi không có kinh nghiệm với các giao dịch WCF, tôi muốn nhiều hơn là xem ai đó xác nhận/sửa lại giả định đó). –
Hey Frank, tôi đang cố gắng để làm cho nó thất bại, do đó scope.Lispose() gọi của tôi. Trong ví dụ đầu tiên nó thất bại một cách chính xác, và trên một thứ 2 nó không. Chỉ cần cố gắng tìm ra những gì tôi cần phải thêm vào lớp học của tôi để làm cho nó hoạt động ... –