การแยกตรรกะทางธุรกิจออกจาก DB- ตรรกะด้วยธุรกรรม


11

สถาปัตยกรรม

เรามีสามชั้นในใบสมัครของเรา ชั้นบริการเพื่อให้ API ภายนอก เลเยอร์ BO สำหรับตรรกะทางธุรกิจของเราและเลเยอร์ DAO สำหรับการเชื่อมต่อฐานข้อมูลของเรา

สมมติว่าทุกครั้งที่เราอัปเดตไฟล์เราต้องการเปลี่ยนบางอย่างในโฟลเดอร์เช่น 'วันที่แก้ไขล่าสุด' ต้องทำสิ่งนี้ในการทำธุรกรรม อาจประสบความสำเร็จและทั้งไฟล์และโฟลเดอร์ได้รับการแก้ไข หรือมีความล้มเหลวและธุรกรรมได้รับการย้อนกลับดังนั้นวัตถุทั้งสองอยู่ในสถานะก่อนหน้า

"แก้ไขโฟลเดอร์เมื่อไฟล์ได้รับการแก้ไข" - ปฏิกิริยาเป็นตรรกะทางธุรกิจอย่างแท้จริง นี่ก็หมายความว่ามันอยู่ในเลเยอร์ BO อย่างไรก็ตามเราใช้ Objectify สำหรับฐานข้อมูลของเราดังนั้นในการเริ่มต้นธุรกรรมที่เราต้องเรียก ofy (). transact (... ) ถ้าเราเรียกใช้ฟังก์ชันนี้ในเลเยอร์ BO สิ่งนี้จะหยุดการออกแบบของเราเนื่องจากจะมีการเรียกเฉพาะฐานข้อมูล (Objectify) ในชั้นธุรกิจของเรา

อะไรจะเป็นทางออกที่สะอาดสำหรับปัญหานี้


ไม่สามารถFileBOโทรFolderBO.edit(newDate)เนื่องจากปัญหาการทำธุรกรรมหรือไม่
เห็น

Java ไม่มี equvilant ของ c # TransactionScope หรือไม่?
Ewan

ใน Java ขอบเขตการทำธุรกรรมขึ้นอยู่กับกรอบงานที่คุณใช้ ใน JEE นั้นสามารถจัดการได้โดยเซิร์ฟเวอร์แอป แต่โดยปกติแล้วจะถูกกำหนดและจัดการอย่างvía Frameworks เช่น Spring (หมายเหตุประกอบvía, xml, ... )
Laiv

กังวลน้อยลงเกี่ยวกับการพยายามทำให้ "เลเยอร์" ที่แตกต่างกันของแอปพลิเคชันของคุณทำงานได้โดยอิสระ / ไม่รู้จักซึ่งกันและกัน ยอมรับแนวคิดที่ว่าโค้ดของคุณถูกสร้างขึ้นสำหรับสถาปัตยกรรมที่สนับสนุนและแทนที่จะมุ่งเน้นที่การทำให้โค้ดนั้นประกอบไปด้วยความเคารพต่อตัวเอง
Ant P

คำตอบ:


5

การตัดทอนธุรกรรมเป็นตรรกะทางธุรกิจได้อย่างไร ดังนั้นปล่อยให้เลเยอร์ DAO ของคุณมี API เฟรมเวิร์กอิสระ db สำหรับtransactวิธีที่คุณกล่าวถึง (และอาจเป็นอย่างเช่นcommitและrollback) จากนั้นคุณสามารถใช้มันจากเลเยอร์ BO ของคุณโดยไม่ต้องขึ้นอยู่กับฐานข้อมูลหรือเฟรมเวิร์ก db ของคุณ


4

ดูเหมือนว่าObjectifyได้รับการออกแบบมาสำหรับธุรกรรมที่เหมือนอะตอมมิก (ธุรกรรมGoogle Application Engine ) มันจะมีความต้องการที่จะให้คุณพัฒนานามธรรมของคุณเองจัดการการทำธุรกรรม

ในกรณีนี้. สิ่งที่เป็นนามธรรมไปฉันจะมอบหมายการจัดการธุรกรรมให้กับเลเยอร์ด้านบนได้อย่างไร

@DocBrown วิธีการมองหาฉันเร็วและสะอาดโซลูชันเพื่อนำไปใช้กับสถาปัตยกรรมที่กำหนด ( สถาปัตยกรรมชั้น ).

เนื่องจากเราพลาดข้อมูลมากเกินไปเกี่ยวกับแอปพลิเคชันและบริบทของแอปพลิเคชัน Doc จึงดูเหมือนปลอดภัยที่สุดสำหรับฉัน

แต่ผมจะขอแนะนำให้ดูไปUnitOfWorkรูปแบบการออกแบบสำหรับชั้นธุรกิจ ฉันคิดว่ามันเหมาะสมกับการจัดการการทำธุรกรรมโดยวัตถุประสงค์แล

สั้น ๆ สรุปรูปแบบมีจุดมุ่งหมายเพื่อกฎเกณฑ์ทางธุรกิจแค็ปซูลเข้าไปใน การทำธุรกรรมทางธุรกิจ (หน่วยงาน) รูปแบบอนุญาตให้มีการสืบทอดระหว่างB.Tsและจนถึงตอนนี้ที่ฉันเห็นObjectifyเกินไป มันยังรองรับองค์ประกอบ ดังนั้นทั้งโดยองค์ประกอบหรือมรดกวิธีการที่จะช่วยให้ซับซ้อนB.Ts

นำไปใช้กับสถาปัตยกรรมที่กำหนดจะมีลักษณะ:

FileService -> FileBO : new EditFileTransaction().execute()
                           |-> ofy().transact(...)
                           |--> FileDAO.actionA()
                           |--> FolderDAO.actionA()
                           |-> [ofy().commit(...)|ofy().rollback()]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.