2012-03-31 15 views
12

तो मान लें कि हमारे पास कुछ संस्थाएं हैं जिन्हें हम डीएओ ऑब्जेक्ट्स का उपयोग करना जारी रखना चाहते हैं। तो हम सही इंटरफ़ेस को लागू तो हमडीएओ डिजाइन पैटर्न

class JdbcUserDao implements UserDao{ 
//... 
} 

class JdbcAddressDao implements AddressDao{ 
//... 
} 

तो अगर मैं JDBC से जेपीए के लिए दृढ़ता कार्यान्वयन स्विच करने में सक्षम होना चाहता हूँ के साथ खत्म हो और इसके विपरीत (उदाहरण के लिए), मैं JPAUserDao और JPAAddressDao की आवश्यकता होगी ... मतलब है कि मेरे पास 20 इकाइयां थीं, और कार्यान्वयन स्विच करने का निर्णय लिया (डी कंटेनर का उपयोग करके), मुझे कोड में जेपीए के साथ हर जेडीबीसी कार्यान्वयन को स्विच करना होगा।

अब यह हो सकता है मैं गलत समझा कि कैसे डीएओ काम करता है, लेकिन ... अगर मैं सिर्फ था

class JdbcDaoImpl implements UserDao,AddressDao{ 
//... 
} 

मैं तो एक कक्षा में सभी JDBC कार्यान्वयन होगा, और स्विचिंग कार्यान्वयन एक टुकड़ा होगा केक का इसके अलावा, दाओइम्पल गिनती दाओ इंटरफेस की संख्या के बराबर है। क्यों न केवल उन्हें कार्यान्वयन (जेडीबीसी, जेटीए, जेपीए ...) द्वारा समूहित करें और सबकुछ एक वर्ग के नीचे है?

अग्रिम धन्यवाद।

+3

एक ही कारण है कि आप में एक बड़ा 'मुख्य()' विधि अपने आवेदन बाहर कोड नहीं है: चिंताओं की जुदाई। (बीटीडब्ल्यू कोई भी आपको एक अमूर्त 'जेडीबीसीडाओबेस' कोडिंग से रोकता है जिसमें सामान्य कोड होता है और इसे आपके 'दाओ' में बढ़ाया जाता है) – rsp

+0

100 वर्गों की तुलना में 1 वर्ग में 500 विधियों को प्रतिस्थापित करना क्यों आसान होना चाहिए? –

उत्तर

20

आपके पूरे एप्लिकेशन में प्रत्येक डीएओ इंटरफ़ेस को लागू करने के लिए एक भी कक्षा को लागू करना एक खराब डिजाइन होगा।

एक अधिक विशिष्ट पैटर्न एक BaseDAO इंटरफेस (भी अक्सर GenericDAO कहा जाता है) के लिए और राशि है एक JPABaseDAO, JDBCBaseDAO आदि ये आधार वर्ग को खोजने/प्राप्त/पढ़ा, बचाने/स्टोर/जारी रहती है, अद्यतन/संशोधित तरह के तरीकों में शामिल होंगे और हटाएं/निकालें/शुद्ध करें। UserDAO तरह

विशिष्ट डीएओ इंटरफेस तो BaseDAO से विरासत और ठोस कार्यान्वयन JPAUserDAOJPABaseDAO से विस्तारित होती है।

एक BaseDAO इंटरफेस ऐसा दिखाई दे सकता:

public interface BaseDAO <T> {  
    T getByID(Long ID); 
    T save(T type); 
    T update(T type); 
    void delete(T type); 
} 

और एक UserDAO इंटरफ़ेस:

@Stateless 
public class JPABaseDAO<T> implements BaseDAO<T> { 

    @PersistenceContext 
    private EntityManager entityManager; 

    private final Class<T> entityType; 

    @SuppressWarnings("unchecked") 
    public JPABaseDAO() { 
     this.entityType = ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 

    @Override 
    public T getByID(Long ID) { 
     return entityManager.find(entityType, ID); 
    } 

    @Override 
    public T save(T type) { 
     return entityManager.persist(type);   
    } 

    @Override 
    public T update(T type) {   
     return entityManager.merge(type); 
    } 

    @Override 
    public void delete(T type) { 
     entityManager.remove(entityManager.contains(type) ? type : entityManager.merge(type)); 
    } 

} 

और कुछ: एक JPABaseDAO इस इंटरफेस को लागू करने की

public interface UserDAO extends BaseDAO<User> { 
    List<User> getAllAuthorized(); 
} 

नंगे हड्डियों उदाहरण नमूना UserDAO कार्यान्वयन है कि यह से विरासत होगा:

@Stateless 
public class JPAUserDAO extends JPABaseDAO<User> implements UserDAO { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Override 
    public List<User> getAllAuthorized() { 
     return entityManager.createNamedQuery("User.getAllAuthorized", User.class) 
          .getResultList(); 
    } 
} 

व्यवहार में आधार वर्ग अक्सर कुछ अन्य बातों के पारदर्शी रूप से कर सकते हैं, उदाहरण के जाँच एक इकाई Auditable इंटरफेस किसी तरह लागू करता है, और स्वचालित रूप से दिनांक और उपयोगकर्ता है कि यह संशोधित स्थापित करने के लिए , आदि

अपने डीएओ को लागू करने के लिए ईजेबी का उपयोग करते समय, कार्यान्वयन को बदलने की एक रणनीति सभी जेडीबीसी कार्यान्वयन को एक पैकेज में और दूसरे में सभी जेपीए कार्यान्वयन करना होगा। फिर बस अपने निर्माण में केवल एक कार्यान्वयन पैकेज शामिल करें।

+0

बढ़िया, बहुत बहुत धन्यवाद। सीआरयूडी संचालन के बारे में क्या कई टेबल शामिल हैं? क्या मैं, उदाहरण के लिए, ऑब्जेक्ट प्राप्त करने के लिए एक चुनिंदा कथन निष्पादित करता हूं और किसी अन्य डीएओ इत्यादि के सीआरयूडी को कॉल करने के लिए इसका उपयोग करता हूं, या शायद किसी प्रकार का विदेशी हाइब्रिड डीएओ बना सकता हूं? Btw। आप मेरी बहुत मदद कर रहे हैं, बहुत सराहना की। – Mercurial

+1

सीआरयूडी या जो भी संचालन एकाधिक संस्थाओं/तालिकाओं से जुड़े होते हैं उन्हें अक्सर उन सेवाओं द्वारा संभाला जाता है जो कई डीएओ एकत्र करते हैं। ईजेबी में आप स्वचालित रूप से एक ही दृढ़ता संदर्भ में होंगे, भले ही आप एकाधिक डीएओ (यह प्रचारित) कहते हैं। एक और संभावना यह है कि यदि संस्थाएं संबद्ध हैं (उपयोगकर्ता के पास एक घर है), तो आपको केवल उपयोगकर्ता के लिए डीएओ की आवश्यकता है और जेपीए आपके उपयोगकर्ता ऑब्जेक्ट्स से स्वचालित रूप से घरों को लाएगा/सहेज/अपडेट करेगा। –

+1

हाँ अच्छा है। यह दृष्टिकोण एक है कि मैंने विभिन्न परियोजनाओं में पालन किया। यह काफी अच्छी और स्थिर काम करने के लिए साबित हुआ। मैं इसे यहां विस्तार से वर्णित करता हूं: http://codeblock.engio.net/?p=180 – bennidi

1

निर्भरता इंजेक्शन का पूरा बिंदु कार्यान्वयन के बीच स्विचिंग को आसान बनाना और उपयोगकर्ता को प्रदाता से decouple करना है। इसलिए सभी डी ढांचे कई कार्यान्वयन (यहां आपके जेडीबीसी समूह और आपके जेपीए-समूह) को "समूह" करने का कुछ तरीका प्रदान करते हैं और उन्हें एक ही स्थान पर स्विच करते हैं।

इसके अलावा: आम तौर पर उपभोक्ताओं की संख्या (आपके मामले में: उपयोगकर्ताओं और पतों पर काम कर रहे कुछ व्यावसायिक तर्क) आमतौर पर डीएओ की संख्या से अधिक होती है, डीआई फ्रेमवर्क आपके लिए अधिकांश सामानों को बेकार कर देगा। मान लें: प्रत्येक इंटरफ़ेस के लिए 50 व्यावसायिक सेम, दो इंटरफेस और दो कार्यान्वयन (4 कुल): यहां तक ​​कि मूल DI भी 50 का ख्याल रखेगा। समूह का उपयोग करना आपके लिए बाकी शेष है।

+0

क्या आप "इसके अलावा" भाग को समझा सकते हैं, कृपया? बहुत बहुत धन्यवाद। – Mercurial

+0

@ user1304844: मैं चाहता हूं लेकिन मुझे नहीं पता कि अस्पष्ट क्या है। –

+0

"यहां तक ​​कि मूल DI भी 50 का ख्याल रखेगा। समूह का उपयोग करना आपके लिए बाकी शेष है।" - मैं इसे समझने में असफल रहा। – Mercurial

0

व्यापक रूप से प्रौद्योगिकी अज्ञेय तरीके से डीएओ पैटर्न को लागू करने की निश्चित संभावनाएं हैं जैसे कि दृढ़ता प्रौद्योगिकी स्विच करना या कई तकनीकों को मिलाकर व्यवहार्य हो जाता है। यह आलेख जिथब पर स्रोत कोड समेत एक कार्यान्वयन योजना प्रस्तुत करता है।

http://codeblock.engio.net/?p=180

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