İş mantığını işlemlerle DB mantığından ayırma


11

mimari

Uygulamamızda üç katman var. Harici bir API sağlamak için hizmet katmanı. İş mantığımız için BO katmanı ve veritabanı bağlantımız için bir DAO katmanı.

Diyelim ki bir dosyayı her güncellediğimizde, Klasör'deki bir şeyi değiştirmek istiyoruz, örneğin 'son değiştirilme tarihi'. Bunun bir işlemde yapılması gerekir. Ya başarılı olur ve hem Dosya hem de Klasör düzenlenir. Ya da bir hata var ve işlem her iki nesne de önceki durumda olacak şekilde geri alınır.

"Bir dosya düzenlendiğinde klasörü düzenle" işlemi yalnızca iş mantığıdır. Yani bu BO katmanına ait olduğu anlamına gelir. Ancak, Veritabanımız için Objectify kullanıyoruz, bu nedenle bir işlemi başlatmak için ofy (). Transact (...) 'i çağırmamız gerekiyor. Bu işlevi BO katmanında çağırırsak, Business katmanımızda Veritabanına özel çağrılar (Objectify) olacağından bu tasarımımızı bozar.

Bu sorun için temiz bir çözüm ne olurdu?


Can FileBOçağrı FolderBO.edit(newDate)çünkü işlem sorunu?
Benekli

java c # TransactionScope bir eşdeğeri yok mu?
Ewan

Java'da, işlem kapsamı kullandığınız çerçeveye bağlıdır. JEE yılında tanımlanmış ve Bahar gibi Çerçeveler (vía ek açıklamalar, xml, ...) vía bildirimli yönetilmektedir genellikle uygulama sunucusu tarafından yönetilen fakat olabilir
LAIV

Uygulamanızın farklı "katmanlarını" işlevsel olarak birbirinden bağımsız / cahil hale getirmeye çalışmaktan daha az endişe edin. Kodunuzun desteklediği mimari için oluşturulduğu fikrini kucaklayın ve bunun yerine bu kodu kendine göre iyi oluşturmaya odaklanın.
Ant P

Yanıtlar:


5

İşlemlerinizi nasıl azalttığınız gerçekten de iş mantığıdır. Bu nedenle DAO katmanınızın, transactbahsettiğiniz yöntem için (ve muhtemelen commitve benzeri şeyler için rollback) db çerçevesinden bağımsız bir API sağlamasına izin verin . Daha sonra veritabanınızdan veya db çerçevenizden bağımsız hale getirmeden BO katmanınızdan kullanabilirsiniz.


4

Görünüşe göre Objectify atom benzeri işlemler ( Google Application Engine İşlemleri ) için tasarlanmıştır. Sizden, İşlem Yönetimi ile ilgili kendi soyutunuzu geliştirmenizi talep edecektir .

Bu durumda. soyutlama devam ediyor İşlem yönetimini üst katmanlara nasıl devredebilirim?

@DocBrown yaklaşımı bana verilen mimariye ( katmanlı mimari ) uygulamak için daha hızlı ve daha temiz bir çözüm sunuyor .

Uygulama ve içeriği hakkında çok fazla bilgi kaçırdığımız için, Doc'un çözümü de bana en güvenli görünüyor.

Ancak, iş katmanı için UnitOfWork tasarım modeline bakmanızı öneririm . Bunun Objectify tarafından tasarlanan işlem yönetimine uygun olduğunu düşünüyorum .

Kısaca özetlenen model, iş kurallarını Ticari İşlemlere (iş birimleri) dahil etmeyi amaçlamaktadır . Desen, B.Ts ve şimdiye kadar gördüğüm, Objectify arasında kalıtım sağlar . Kompozisyonu bile destekler. Yani ya bileşim ya da miras yoluyla, yaklaşım karmaşık B.T'lere izin verir .

Verilen mimariye uygulandığında şöyle görünecektir:

FileService -> FileBO : new EditFileTransaction().execute()
                           |-> ofy().transact(...)
                           |--> FileDAO.actionA()
                           |--> FolderDAO.actionA()
                           |-> [ofy().commit(...)|ofy().rollback()]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.