2014-04-09 12 views
5

के बीच अंतर मैंने कुछ संबंधित प्रश्नों को देखा लेकिन फिर भी मुझे एक भंडार और सेवा परत के बीच बहुत अंतर दिखाई नहीं देता है। तो उदाहरण दिया गया मुझे लगता है कि यह इस तरह दिखना चाहिए, अगर नहीं, तो कृपया मुझे बताएं क्यों?रिपोजिटरी और सर्विस लेयर

public interface ProductRepository extends CrudRepository<Product, Long>{ 

    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

public interface ProductService { 

    public List<Product> findAll(); 
    public Product findById(Long id); 
    public Product save(Product product); 
    public void delete(Product product); 
    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

और उत्पाद सेवा का कार्यान्वयन विधियों को लागू करने के लिए ProductRepository का उपयोग करेगा। जैसा कि मैं http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html से समझता हूं, भंडार से विधियों के लिए क्वेरी स्वतः उत्पन्न होती हैं। मेरे उदाहरण में विधियों को रिपोजिटरी और सेवा में दोहराया जाता है, इसलिए कृपया बताएं कि क्या/क्यों बदला जाना चाहिए?

उत्तर

0

जहां तक ​​मुझे पता है, रिपोजिटरी डेटाबेस तक सीधे पहुंचने के लिए है। यह वह जगह है जहां संग्रहीत प्रक्रियाओं को सीधे कॉल या जो भी डेटा स्टोरेज तंत्र होगा।

सेवा परत आपके डेटा का एपीआई है। आमतौर पर कुछ तर्क स्तर होता है जो आप सुनेंगे, या सेवा और भंडार के बीच अमूर्तता की एक और परत में।

उदाहरण के लिए, एक वेबसाइट आपकी सेवा में एक विधि कॉल करेगी। आपकी सेवा उस डेटा को प्राप्त करने के लिए आपके भंडार को कॉल करेगी, फिर आपकी सेवा इसे किसी भी तरह बदल जाएगी (ऑब्जेक्ट्स बनाएं, व्यवसाय नियमों के आधार पर गतिशील जानकारी उत्पन्न करें) फिर वेबसाइट पर वापस जाएं।

+0

ठीक है, तो मेरे उदाहरण में प्रतिनिधि और सेवा परत सही हैं? और अगर मेरे पास कुछ विधियां हैं जैसे मान्य (उत्पाद पी) यह सेवा परत में जाना चाहिए? – April

+0

यह मेरे लिए ठीक लग रहा है। यह कहना मुश्किल है, क्योंकि वे केवल इंटरफेस हैं, लेकिन इस विचार के आधार पर कि आपका रेपो क्रूडरेपो बढ़ाता है, जो मुझे लगता है कि कुछ सहेजने/अपडेट/हटाए गए कार्यों को सही लगता है। सत्यापन के लिए, हाँ, मैं सेवा परत पर किया जा रहा होगा। आम तौर पर हमारे पास एक मध्यवर्ती व्यापार तर्क होता है जो इस तरह की चीजों को संभालता है। इसलिए, उदाहरण के लिए, सेवा व्यवसाय तर्क कहती है जो रेपो कहती है, लेकिन यह परियोजना के आकार पर निर्भर है। – JasonWilczak

4

रिपोजिटरी लेयर आपको डेटा एक्सेस पर अतिरिक्त स्तर का अमूर्तता देता है। रिपोजिटरी परत बुनियादी सीआरयूडी संचालन का खुलासा करती है।

सेवा परत व्यापार तर्क का खुलासा करती है, जो भंडार का उपयोग करती है।

आप एक अधिक विस्तृत जवाब यहाँ पढ़ सकते हैं: https://stackoverflow.com/a/5049454/1446006

1

भंडार एक डेटा का उपयोग पैटर्न, जिसमें आंकड़ा अंतरण वस्तुओं भंडार उद्देश्य यह है कि CRUD संचालन का प्रबंधन करता है में पारित कर दिया जाता है। यह पैटर्न उन स्थितियों में उपयोगी है जहां आपके डेटा एक्सेस की तंत्र महत्वपूर्ण रूप से बदल सकती है - उदा। आप ओरेकल जैसे एक कार्यान्वयन और SQL सर्वर या यहां तक ​​कि HADOOP में भिन्न डेटा स्टोर्स की अपेक्षा करते हैं।

एक सेवा परत एक व्यावसायिक तर्क पैटर्न है जिसका प्रयोग आमतौर पर सास आर्किटेक्चर में किया जाता है। एक सेवा परत का उपयोग एक या अधिक प्रस्तुति कार्यान्वयन को एक सामान्य इंटरफेस के माध्यम से अपने व्यापार तर्क तक पहुंचने की अनुमति देता है। उदाहरण के लिए यदि आप चाहते हैं कि आपकी वेबसाइट में एपीआई हो, तो आप सामान्य बैक-एंड कार्यक्षमता को लागू करने के लिए एक सेवा परत का उपयोग करेंगे, जो साइट और एपीआई दोनों उपभोग करेंगे।

पूर्व को डेटा एक्सेस के साथ और बाद वाले व्यापार तर्क के साथ चिंतित होना चाहिए। न तो अनिवार्य है और न ही दूसरे के साथ होना चाहिए। सरल अनुप्रयोगों में दोनों पैटर्न एक ही कक्षा द्वारा लागू किए जा सकते हैं।

3

आपके सभी व्यावसायिक तर्क सेवा स्तर में होना चाहिए।

डेटाबेस (किसी भी भंडारण) के लिए कोई भी एक्सेस रेपोजिटरी परत पर जाना चाहिए।

चलिए एक उदाहरण लेते हैं। आपको एक इकाई (व्यक्ति) को सहेजना है। लेकिन उस व्यक्ति को बचाने से पहले आप यह सुनिश्चित करना चाहते हैं कि व्यक्ति का फर्स्टनाम पहले से मौजूद नहीं है।

तो सत्यापन भाग व्यापार परत पर जाना चाहिए।

सेवा लेयर

PersonRepository repository; 
public Person save(Person p){ 
    Person p = findByName(p.getName(); 
    if (p != null){ 
      return some customException(); 
    } 
    return repository.save(p); 
} 

public Person findByName(String name){ 
    return repository.findByName(name); 
} 

में और अपने भंडार परत सिर्फ डीबी ऑपरेशन पर ध्यान केंद्रित में

आप इसे रिपोजिटरी लेयर में स्वयं कर सकते थे। मान लीजिए कि आपने इसे अपने रिपोजिटरी में कार्यान्वित किया है, तो आपकी बचत विधि हमेशा सहेजने से पहले जांचें (कुछ समय आपको ऐसा करने की आवश्यकता नहीं है)।

संबंधित मुद्दे