2013-06-08 26 views
5

Tôi đang sử dụng JDO để lưu trữ dữ liệu trong dự án Play 2.1 Scala. Lý tưởng nhất, tôi muốn mỗi yêu cầu có giao dịch riêng của mình, cam kết khi giao dịch kết thúc và quay lại nếu xảy ra sự cố. Cách tốt nhất tôi có thể tìm ra để làm điều này là với Thành phần hành động, nơi tôi tạo đối tượng giống như Action giống như bắt đầu giao dịch, bao bọc khối mã trong một Action, đánh giá nó và lưu kết quả, cam kết hoặc cuộn lại giao dịch và sau đó trả về kết quả.Cách thông thường để xử lý giao dịch trong Play 2 Scala là gì?

Điều duy nhất liên quan đến tôi về điều này là toàn bộ dự án của tôi bây giờ bao gồm DbAction s thay vì thường xuyên Action s. Tôi không chắc tại sao điều này liên quan đến tôi, ngoại trừ việc tôi nghĩ rằng phải có một nơi tốt hơn để làm điều này. Tuy nhiên, khi tôi kiểm tra các móc có sẵn trong GlobalSettings, không có gì trông giống như nó sẽ làm việc.

Tôi có nên chỉ cần đi với DbAction và dừng tự đoán thứ hai, hoặc có một nơi để treo hành vi này để tôi chỉ có thể sử dụng Action không?

Todd

Trả lời

0

Tôi không chắc rằng thực tiễn tốt nhất cho việc này là chưa. Tôi mong được đọc câu trả lời của người khác.

This page sẽ cho bạn biết cách thực hiện những gì bạn muốn làm. Về cơ bản trong Global bạn có thể mở rộng WithFilters hoặc ghi đè lên doFilter. Bạn vẫn chỉ gói hành động, nhưng bạn đang làm nó từ một nơi trung tâm.

Bây giờ, có hay không đây là một ý tưởng tốt hơn so với thực hiện các compsoition hành động như đề xuất here, tôi không biết.

+0

Tôi ước gì tôi có thể kiểm tra cả hai câu trả lời, vì cả hai đều có vẻ như một cách để đối phó với vấn đề. Tôi muốn những người khác, những người có chuyên môn hơn, sẽ đưa ra ý kiến ​​của họ. Tôi đoán ưu điểm của Action Composition là tôi có thể tiếp tục và cung cấp một số bit dữ liệu chuẩn mà rất nhiều bộ điều khiển sẽ cần truy cập. Lợi thế của việc sử dụng một bộ lọc (mà tôi đã không nhìn thấy trước đây) là nó tất cả đằng sau hậu trường và bạn đối phó với bất cứ điều gì một cách rõ ràng. – TOB

2

Tôi không nếu đó là giải pháp thay thế tốt hơn, nhưng bạn cũng có thể sử dụng Action Composition thay vì tạo phân lớp thông qua kế thừa.

Về cơ bản, bạn có thể viết một cái gì đó như thế này:

def TransactionalAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    startTransaction 
    try { 
     f(request) 
     commit 
    } catch { 
     case e: Exception => rollback 
    } 

    } 
} 

và sau đó sử dụng:

def index = TransactionalAction { request => 
    val something = someQueriesInDB 
    Ok(something) 
} 
+0

Duh! Tôi có nghĩa là Thành phần hành động chứ không phải phần mở rộng. Nó chỉ * cảm thấy * như tôi đang mở rộng 'Hành động', nhưng tôi thực sự chỉ gói nó lại. Tôi sẽ chỉnh sửa câu hỏi của mình để làm rõ. – TOB

+0

Ah ok, xin lỗi :-) –

+1

Không, xin lỗi tôi đã lãng phí thời gian của bạn bằng văn bản mà câu trả lời xuất sắc (mà tôi có thể nói, vì đó là những gì tôi có nghĩa là ở nơi đầu tiên). :-) – TOB

Các vấn đề liên quan