मैं इस तरह से काम करता हूं (Struts2 + Hibernate):
मेरा स्ट्रट्स एक्ट केवल वेब ब्राउजर पर शो के लिए जिम्मेदार है। नहीं सोच रहा है।
उपयोगकर्ता -> कार्रवाई -> सेवा -> भंडार -> डेटा एक्सेस
या:
मैं चाहता हूं कि देखें -> कैसे देखें -> क्या करें -> कैसे प्राप्त करें -> कहां से प्राप्त करें
इसलिए, पहली परत में (दृश्य) मेरे पास कुछ ऐसा है:
public String execute () {
try {
CourseService cs = new CourseService();
Course course = cs.getCourse(idCourse);
} catch (NotFoundException e) {
setMessageText("Course not found.");
} catch (Exception e) {
}
return "ok";
}
जैसा कि आप देखते हैं, मेरा "दृश्य" नहीं लगता है। यह एक विशिष्ट पाठ्यक्रम के लिए एक सेवा (पाठ्यक्रमों का प्रबंधन) के लिए पूछ रहा है। यह सेवा कई काम कर सकती है, जैसे रिपोर्ट, सीरियल्स, इत्यादि। परिणाम हमेशा एक सूची या एक विशिष्ट वस्तु (उदाहरण के लिए) होती है। सेवाएं वास्तविक मशीन हैं, नियम लागू करती हैं और रिपॉजिटरी तक पहुंचती हैं (डेटा का प्रबंधन करने के लिए)।
इसलिए, यदि मैं अपनी सेवाएँ, रिपॉजिटरी और DAOS विभिन्न पुस्तकालयों में रखता हूँ, तो मैं इसका उपयोग पाठ-आधारित कार्यक्रम या विंडो आधारित डेस्कटॉप सिस्टम में भी कर सकता हूँ, जिसमें कुछ भी नहीं बदल सकता है।
सेवा जानता है कि क्या करना है, लेकिन पता नहीं है कि कैसे दिखाना है। दृश्य दिखाता है कि कैसे दिखाना है, लेकिन यह नहीं जानता कि क्या करना है। सेवा / रिपॉजिटरी के साथ समान: सेवा डेटा के लिए भेजती है और अनुरोध करती है, लेकिन यह नहीं जानती है कि डेटा कहां है और इसे कैसे लेना है। भंडार वस्तुओं को खरीदने के लिए कच्चे डेटा को "मेक अप" करता है ताकि सेवा के साथ काम कर सके।
लेकिन रिपॉजिटरी को डेटाबेस के बारे में कुछ भी पता नहीं है। डेटाबेस प्रकार (MySQL, PostgreSQL, ...) DAO की चिंता करता है।
यदि आप डेटाबेस को बदलना चाहते हैं तो आप DAO को बदल सकते हैं और ऊपरी परतों को प्रभावित नहीं करना चाहिए। यदि आप अपने डेटा प्रबंधन को अद्यतन करना चाहते हैं, तो आप रिपॉजिटरी को बदल सकते हैं, लेकिन यह DAO और ऊपरी परतों को प्रभावित नहीं करना चाहिए। यदि आप अपना तर्क बदलना चाहते हैं, तो आप सेवाओं को बदल सकते हैं, लेकिन इसके लिए ऊपर या नीचे की परतों में गड़बड़ नहीं करनी चाहिए।
और आप कुछ भी देखने में बदल सकते हैं, यहां तक कि प्रौद्योगिकी (वेब, डेस्कटॉप, पाठ) लेकिन इसका मतलब यह नहीं है कि नीचे कुछ भी स्पर्श किया जाना चाहिए।
व्यापार तर्क सेवा है। लेकिन यह देखने के लिए कैसे बातचीत करनी है। अब क्या बटन दिखायें? क्या उपयोगकर्ता इस लिंक को देख सकता है? सोचें कि आपका सिस्टम एक कंसोल-आधारित प्रोग्राम है: आपको इस बात से इनकार करना होगा कि क्या गलत उपयोगकर्ता #> myprogram -CourseService -option=getCourse -idCourse=234
इस कमांड को लिखने के लिए कुंजी दबाने के लिए उसे चुनते हैं या रोकते हैं?
वेब-आधारित प्रणालियों (स्ट्रट्स + जावाईई) में बात करते हुए मेरे पास एक अलग जीयूआई नियंत्रक पैकेज है। एक्शन व्यू में मैं लॉग इन किया हुआ उपयोगकर्ता देता हूं और क्लास मुझे बटन (या कोई भी इंटरफ़ेस तत्व जो मैं चाहता हूं) देता है।
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
तथा
private List<ActionButton> actionButtons;
इसे सेवाओं से बाहर रखना याद रखें। यह VIEW सामान है। इसे स्ट्रट्स एक्ट्स में रखें। किसी भी इंटरफ़ेस इंटरैक्शन को वास्तविक व्यापार कोड से पूरी तरह से अलग होना चाहिए, इसलिए यदि आप अपने सिस्टम को पोर्ट करते हैं, तो आपको जो भी ज़रूरत नहीं होगी उसे काटने में आसान होगा।