2012-04-18 13 views
7

मैं this article में विस्तृत रूप से Udi Dahan के डोमेन ईवेंट पैटर्न और आधारभूत संरचना के एक साधारण जावा कार्यान्वयन की तलाश में हूं।डोमेन इवेंट पैटर्न कार्यान्वयन?

यह बहुत आसान है और मैंने अपनी खुद की व्याख्या लागू की है, हालांकि मैं जावा नौसिखिया हूं और भाषा के साथ अनुभवहीनता के कारण किसी भी गलती से काटना नहीं चाहता हूं।

मुझे मिला एकमात्र जावा कार्यान्वयन Jdon Framework में है, लेकिन यह मेरे प्रोजेक्ट में मेरे वर्तमान के लिए थोड़ा हेवीवेट है।

धन्यवाद!

उत्तर

1

मैं वर्तमान में आपके द्वारा संदर्भित "मुक्ति" लेख के समान कुछ करने के लिए Googles Guava EventBus का उपयोग कर देख रहा हूं।

यह कुछ इस तरह, लगभग ठीक लेख के रूप में ही "कैसे डोमेन घटनाओं को बढ़ाने के लिए" विचार करेंगे के लिए इसी तरह का उपयोग करना:

public class Customer 
{ 
    public void DoSomething() 
    { 
     MyEventBus.post(new CustomerBecamePreferred() { Customer = this }); 
    } 
} 

मैं नहीं जानता कि क्या है या नहीं आप इस पर विचार कर रहे "उडी दहन के डोमेन घटनाक्रम पैटर्न के कार्यान्वयन" के रूप में।

इसे किसी भी इंटरफेस को लागू करने की आवश्यकता नहीं है; इवेंट हैंडलर को एनोटेशन के साथ चिह्नित किया जाता है और कक्षा MyEventBus.register(aListenerObject)

+0

धन्यवाद स्टीफन, यह बहुत अच्छा है - मुझे अमरूद के बारे में पता नहीं था। मैं वास्तव में अपने डोमेन को कार्यान्वयन विवरणों से अनजान रखने की कोशिश कर रहा हूं, लेकिन मैं कुछ विचारों को गवा इवेंटबस दूंगा। शायद मैं अपने डोमेन से कार्यान्वयन को छिपाने के लिए इवेंटबस को लपेट सकता हूं ... – HolySamosa

+0

हाँ @ होलीसामोसा - जब मैं इसे डालता हूं, तो मैं उसे लपेटने जा रहा हूं, लेकिन सरल 'रजिस्टर()' और 'पोस्ट()' इंटरफेस को सरल रखें यह। –

+0

मुझे लगता है कि आप अपने डोमेन मॉडल में गुवा सदस्यता लें एनोटेशन रखने जा रहे हैं? मुझे बाध्यकारी सदस्यता के लिए एनोटेशन का उपयोग करने का विचार पसंद है, लेकिन मैं अपने अच्छे, स्वच्छ डोमेन मॉडल में इस तरह के एक कार्यान्वयन विस्तार को पर्ची नहीं देना चाहूंगा। – HolySamosa

5

के साथ इवेंटबस के साथ पंजीकृत है, मैं थोड़ी देर के लिए जावा ईई में एक ही समस्या का हल ढूंढ रहा हूं। मैंने Axon और jdon देखा (पृष्ठ वास्तव में अच्छी तरह से अच्छा नहीं है :))। दोनों में इवेंट सोर्सिंग शामिल है जिसे मैं अपने नियोक्ता/ग्राहकों को "बेचना" नहीं कर सका। मैं डोमेन इवेंट्स चाहता था हालांकि मैं .NET/C# परियोजनाओं में उनके लिए बहुत अधिक उपयोग करता था। तो मैं निम्नलिखित के साथ आया ...

मैंने एक समान स्थिर डोमेनइवेंट ऑब्जेक्ट का उपयोग किया ताकि मुझे मेरे डोमेन मॉडल इकाइयों को लीक करने वाले वास्तविक कार्यान्वयन विवरण के बिना प्रकाशन तंत्र तक पहुंच प्रदान की जा सके। तो इस तरह से कॉल कुछ:

DomainEvents.fire(new MySampleEvent(...some params...)); 

एक पैटर्न और तंत्र कि CDI कल्पना में उपलब्ध है Events with @Observes है कि आप सभी सेवा उपलब्ध के साथ सामान्य सेम में कुछ घटनाओं पर प्रतिक्रिया के लिए अनुमति देते हैं। यह वही है जो डीआई फ्रेमवर्क जैसे Castle Windsor का उपयोग करते समय किया गया था जहां मैं इंटरफेस द्वारा जेनेरिक हैंडलर पंजीकृत कर सकता था। तो मुझे पर्यवेक्षकों (हैंडलर, श्रोताओं, जिन्हें आप उन्हें कॉल करना चाहते हैं) मिला है। उदाहरण:

@Stateless 
public class MySampleEventObserver { 

    public void listen(@Observes MySampleEvent event) { 
    ... 
    doSomethingWithEvent(); 
    } 
} 

अब प्रकाशन (सीडीआई में फायरिंग) भाग के लिए। चूंकि संस्थाओं में सीडीआई तक पहुंचने का कोई तरीका नहीं है (अच्छे कारण से!) मैंने जेएनडीआई और BeanManager का उपयोग करने का संकल्प किया। मैंने बीएनएमएनेजर प्राप्त करने के लिए जेएनडीआई का इस्तेमाल किया और इसकी fireEvent विधि का उपयोग किया।सेम प्रबंधक को हल करने कोड में डाल करने के लिए (seen here के रूप में):

public class BeanHelper { 
    public static BeanManager getBeanManager() { 
    try { 
     InitialContext initialContext = new InitialContext(); 
     return (BeanManager) initialContext.lookup("java:comp/BeanManager"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 

}

अंतिम चरण है DomainEvents ही वस्तु:

public class DomainEvents { 

    private static boolean mNopMode = false; 

    public static void setNopMode() { 
    mNopMode = true; 
    } 

    public static void reset() { 
    mNopMode = false; 
    } 

    public static <TDomainEvent> void fire(TDomainEvent event) { 
    if (mNopMode) { 
     return; 
    } 
    BeanManager manager = BeanHelper.getBeanManager(); 

    manager.fireEvent(event); 
    } 

}

setNopMode और reset भागों कोई संदर्भ नहीं होने पर परीक्षण उद्देश्यों के लिए हैं। मूल रूप से मैन्युअल मॉकिंग। यूनिट परीक्षण से पहले एनओपी ऑपरेशन मोड में सेट करें और उनके बाद रीसेट करें।

एक पीओसी के रूप में ठीक काम करता है। पता नहीं है कि इसके उपयोग के लिए कोई गंभीर सीमाएं हैं या नहीं। मैं एसिंक बस इंटरैक्शन छोड़ देता हूं और श्रोताओं के कार्यान्वयन के समान हूं।

किसी भी टिप्पणी से प्यार होगा।