Hizmet katmanı vs DAO - Neden ikisi de?


64

Java web uygulaması örneğindeki SpringMVC, Hibernate ve bazı veritabanları ile çalışıyorum.

Bunu yapan birkaç farklı şey var, ancak bu İlkbahar 3 ve kış uykusu bütünleştirme eğitiminde örnek bir model sınıfı, görünüm (jsp) ve denetleyici için bir hizmet ve dao sınıfı var.

Sorum şu ki, hem hizmet hem de DAO sınıfları aynı şeyi yapmıyor mu? Neden ikisine de ihtiyacın var?

Bu aslında kullandığım öğreticiydi: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Yanıtlar:


60

Genel olarak DAO mümkün olduğu kadar hafiftir ve yalnızca DB ile bağlantı sağlamak için vardır, bazen soyutlanır, böylece farklı DB arka uçları kullanılabilir.

Hizmet katmanı, DAO'ya ve istemciye gönderilen ve gönderilen veriler üzerinde çalışacak bir mantık sağlamak için vardır. Çok sık olarak bu 2 parça aynı modüle, bazen de aynı koda birleştirilecek, ancak yine de onları ayrı mantıksal varlıklar olarak göreceksiniz.

Başka bir neden de güvenlik - Eğer DB ile ilişkisi olmayan bir servis katmanı sağlarsanız, servis dışındaki servis istemcisinden DB'ye erişmek daha zordur. DB'ye doğrudan müşteriden erişilemiyorsa (ve hizmet olarak kullanılan önemsiz bir DAO modülü bulunmuyorsa), müşteriyi ele geçiren tüm saldırganlar, servis katmanını kesmeden önce servis katmanını da kesmeyi denemektir. Verilerinize en sterilize edilmiş erişim.


1
Hizmet ve dao katmanlarının ve iş mantığınızı içeren hizmet katmanınızın ayrılmasını kabul ediyorum.
Peter Delaney

Bir servisin birkaç DAO'yu arayabileceğini, örneğin bir kullanıcıyı kaydederken UserDao, UserOrdersDao ile konuşabileceğiniz bir kullanıcıyı kaydedebileceğinden bahsetmeyin. Ve sonra bütün bu hizmetleri kim arayabilir?
Fermin Silva

40

Ben söz konusu postanın yazarıyım. Farklı teknolojiler ve farklı mimariler üzerinde çalışmaktan payımı aldım. Yukarıdakilere dayanarak, servis katmanının ve dao katmanının olmasının her zaman iyi bir fikir olduğunu güvenle söyleyebilirim. DAO sadece veri tabanına / veritabanına Entity nesneleri eklemek / güncellemek / eklemek / seçmekle sınırlı kalmalı ve hepsi bu. Mantık açısından fazladan bir şey yapmak istiyorsanız, servis katmanına ekleyin. Bu, veritabanının değiştirilmesi durumunda kodun modüler ve kolayca değiştirilebilir olmasına yardımcı olacaktır (verilerin bir kısmı için). Bu özellikle veritabanından veri aldıktan sonra bile ağır mantığı olan raporları içeren uygulamalarda uygulanabilir.

Ayrıca, ilkbaharda güvenlik ideal olarak servis katmanında uygulanır. Bu şekilde değiştirmek istemezsiniz.


5
Soruma cevap verdiğiniz için teşekkür ederim; bu blogunuza ithaf! Harika bir örnek için teşekkürler, yazmaya devam edin.
Jeff,

Bu bir süredir aklımı rahatsız ediyordu ve bence deneyim bu durumlarda en fazla yardımcı oluyor. Teşekkür ederim.
Utku Özdemir

Hizmet ve dao katmanlarının ve iş mantığınızı içeren hizmet katmanınızın ayrılmasına katılıyorum ve yalnızca Dao yöntemlerini arayabilirim. Servis metotlarımdan birinin başka bir servis metodunu çağırması gerektiğinde ne olur? Birden fazla servis yöntemi çağıran servis katmanının üstünde başka bir soyutlama yapmalı mıyım?
Peter Delaney

Hayır. Servis katmanındaki sınıflar birbirlerinin referansını alabilir (gerektiği gibi) ve gerekli yöntemleri arayabilirler.
lokesh 11

11

Adam Bien kitabında JPA EntityManager'ın DAO'nun iyi bir evrensel uygulaması olduğuna dikkat çekiyor:

http://realworldpatterns.com/

Java EE dünyasında, neredeyse hiçbir zaman kendi DAO'nuzu yazmaya gerek yoktur çünkü JPA uygulamaları bunlardan birini içerir. Sadece servis katmanını yazmanız gerekir.

Kendi DAO katmanınızı uygulamak, 15 yıl öncesinin çok zayıf olan J2EE mimarisinden gerçekten bir akşamdan kalmadır, ancak birçok insan hala bunu yapmaya zorlanır. Bu özel DAO katmanları, EntityManager'da karşılık gelen yöntemi çağıran yönlendirme işlevlerinden başka bir şey sağlamaz.

Bu nedenle sorunuzu yanıtlamak için, evet bir servis katmanına ve bir DAO'ya ihtiyacınız var, ancak yalnızca servis katmanını yazmanız gerekir.


2
Bunun Bahar için geçerli olup olmadığından emin değilim - her zaman Model için yapılması gereken özel bir DAO vardır. Belki de "Neredeyse hiçbir zaman kendi DAO'nuzu yazmaya gerek kalmaz" ifadesi özellikle EJB kapları / uygulama sunucusu için geçerlidir?
Don Cheadle,

1
Kendi yazınızı yazması daha iyidir (DAO / DAOImpl), sadece EntityManager ile eşleşse de - İşte bu, gelecekte servis katmanı kodunu değiştirmek zorunda kalmadan başka bir DAO uygulaması ekleyebilirsiniz .
ahmednabil88

@YajliMaclo ne değişmeli?
Alex78191

4

Genelde tüm db'ye özgü kodları (sorguları) DAO'lara, işlem işleme ve iş mantığını hizmetlere koyarım. Bu, hizmet yöntemlerinin birden çok dao genelinde yöntemleri çağırmasına ve hepsini aynı işlem içinde tutmasına olanak tanır. Benim düşünceme göre, bu dao genelinde daha iyi kod kullanımı için izin veriyor.


2

Servis katmanının çoğu durumda gereksiz karmaşıklık kattığını buldum. Teoride, işletmelerin dao katmanında mantık sahibi olmasından kaçınmak, ancak sonunda bu sadece kafa karışıklığına yol açıyor, hatta bazı insanlar dao katmanını tamamen kaldırmak istemiyor, çünkü değer katmadığını düşünüyorlar. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Fakat birden fazla işletme mantığınız varsa, evet, bu iyi bir fikirdir. Servis katmanı oluşturmak ne kadar önemlidir?


3
Ayende'nin blog yazısını şimdi defalarca okudum ve tasarımının (bir noktada aynı fikirde olduğum gibi) YAGNI'nin ruhuna sadık kalırken bile, kaçınılmaz bir şekilde daha fazla zaman harcayacağı fikrini sallayamıyorum. orta vadede, ilk etapta katmanların soyutlanmasının kurulmasının maliyeti olacaktır. Tüm uygulama ile NHibernate arasındaki sıkı bağlantı konusundaki fikrini değiştirip değiştirmediğini şimdi tek bir uygulamanın birden fazla SQL, NoSQL ve API veri kaynağını sorgulaması daha da yaygınlaştığını merak ediyorum.
Bay Cochese

@ LennyGodber evet, IMO hissinin DAO / depo katmanına sahip olmaktan daha iyi olduğunu biliyorum çünkü dezavantajlara göre daha fazla avantajı var çünkü çok sayıda veri kaynağına sahip olmak çok yaygındır
Jesus

-1

IMHO Hizmet katmanı, denetleyici ve DAO katmanı arasında bir katman olarak kabul edilebilir. Bu hizmet katmanı tam olarak iş mantığı ekleyebileceğimiz ve hatta görünümün neye göre oluşturulacağına özgü bir geri dönüş nesnesi oluşturabileceğimiz yerdir.

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.