2012-04-24 16 views
5

मैं एक 2 डब्ल्यूसीएफ सेवाओं को डिजाइन कर रहा हूं जो मेरे सभी ग्राहक कनेक्ट होंगे। इनमें से एक सेवा अधिसूचना सेवा होगी।डब्ल्यूसीएफ डुप्लेक्स - प्रत्येक ग्राहक को अलग-अलग अधिसूचनाएं पुश करें?

मैं चाहता हूं कि प्रत्येक क्लाइंट सेवा से जुड़ें, इसकी सदस्यता लें और फिर डुप्लेक्स कॉलबैक इंटरफ़ेस का उपयोग करके अधिसूचनाएं प्राप्त करें (सेवा ग्राहकों में 'सूचित करें' ऑपरेशन को आग लग जाएगी)।

यह मेरा डिजाइन आइडिया है:

enter image description here

मेरे सवाल यह है: प्रत्येक ग्राहक मेरी सेवा को जोड़ता है, मैं इसे अपने डेटाबेस में 'उपयोगकर्ता' तालिका के विरुद्ध सत्यापन (मैं एक का उपयोग किया जाएगा होगा UserNamePasswordValidator और 'मान्य' फ़ंक्शन लागू करें)।

आवश्यकता: डेटाबेस में परिभाषित नियमों के आधार पर प्रत्येक उपयोगकर्ता को विभिन्न अधिसूचनाएं प्राप्त करने की आवश्यकता होती है, लेकिन वे सभी एक ही अनुबंध का उपयोग करते हैं।

उदाहरण के लिए:

जॉन स्मिथ की डीबी में नियम हो सकता है हो सकता है: मुझे सभी नए उत्पादों के 100 से अधिक डॉलर की कीमत है पर सूचित करें।

डीबी में जेन डो के नियम हो सकते हैं: उन सभी नए उत्पादों पर मुझे सूचित करें जिनके नाम 'जेए' से शुरू होते हैं।

डीबी में जिम जबरा के नियम हो सकते हैं: मुझे 'खाद्य' प्रकार के सभी नए उत्पादों पर सूचित करें।

मेरी सेवा में एक कार्यकर्ता थ्रेड होगा जो डेटाबेस में परिवर्तन का पता लगाता है (डेटाबेस में एक नया उत्पाद डाला गया था)।

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

फिर से - सभी क्लाइंट एक ही प्रकार के अपडेट (नए उत्पाद) प्राप्त करते हैं, लेकिन प्रत्येक क्लाइंट को डेटाबेस में नियम के अनुसार विभिन्न उत्पादों को प्राप्त करना चाहिए।

  • ग्राहक Enpoint
  • उपयोगकर्ता ऑब्जेक्ट (डेटाबेस से)

:

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

दूसरा दृष्टिकोण होगा ... ठीक है ... मुझे लगता है मैं एक कार्यकर्ता धागे से सेवा से जुड़े ग्राहकों की एक सूची कैसे उपयोग कर सकते हैं की एक और विचार की जरूरत नहीं है ...

मुझे लगता है कि मेरी मुख्य समस्या यह है कि प्रत्येक ग्राहक विभिन्न प्रकार के उत्पाद को अधिसूचित कर सकता है।मतलब - पब \ सब विधि यहां इतना अच्छा नहीं है, क्योंकि मेरे परिदृश्य में ग्राहकों के बारे में जानना आवश्यक है।

इस सिरदर्द को हल करने के तरीके पर कोई सुझाव?

+0

क्या आपने कतार का उपयोग करने के बारे में सोचा है। जहां आपका प्रत्येक ग्राहक कतार और डेटा के लिए मतदान के साथ जोड़ता है, जहां वे उपलब्ध हैं। और सरल है कि डब्ल्यूसीएफ सेवा डेटा की सदस्यता लेने के लिए एक सेवा है। फिर अपने कार्यकर्ता थ्रेड में, जब डेटा से संबंधित डेटा क्लाइंट कतार में डेटा दबाएं। – rpgmaker

+0

एक कतार मेरी समस्या को ठीक तरह से कैसे हल करेगी? आपका क्या मतलब है 'डब्ल्यूसीएफ सेवा डेटा की सदस्यता लेने के लिए एक सेवा होगी'? क्या आपके पास नमूना या उदाहरण है जिसे मैं देख सकता हूं? –

+0

मेरी प्रतिक्रिया – rpgmaker

उत्तर

2

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

क्लाइंट वह है जो सर्वर से कनेक्शन शुरू करता है, और यदि यह कनेक्शन खो जाता है तो आप इस कनेक्शन को खोलने की आवश्यकता रखते हैं, तो आप सर्वर से क्लाइंट से कनेक्शन शुरू नहीं कर सकते हैं, क्योंकि क्लाइंट एनएटी के पीछे हो सकता है , फ़ायरवॉल, आदि

तो किसी भी तरह से सर्वर की तरफ कुछ स्थिर (सिंगलटन) ऑब्जेक्ट होना चाहिए जो क्लाइंट कनेक्शन सूची रखता है, सोचा कि यह आवश्यक डब्ल्यूसीएफ सेवा नहीं है। आप निर्भरता इस वस्तु को सेवा निर्माता में इंजेक्ट कर सकते हैं।

public class ProductRepository 
{ 
    private EventAggregator eventAggregator; 

    public void Add(Product product) 
    { 
     //... 
     eventAggregator.Publish(new NewProductEvent(product)) 
    } 
} 
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] 
public class EventPublishingService 
{ 
    private IClientCallback client; 
    private EventAggregator eventAggregator; 
    private Func<Product, bool> predicate; 

    public EventPublishingService(...) 
    { 
     eventAggregator.Subscibe<NewProductEvent>(OnNewProduct); 
    } 
    private void OnNewProduct(NewProductEvent e) 
    { 
     if (predicate(e.Product)==true) client.Notify(e.Product); 
    } 

    public void Subscribe() 
    { 
     client = OperationContext.Current.GetCallbackChannel<IClientCallback>() 
     var user = ServiceSecurityContext.PrimaryIdentity; 
     predicate = GetFilterForUser(user); 
    } 
} 
+0

से नीचे है तो आप कह रहे हैं कि मुझे सिंगलटन सेवा की आवश्यकता है, और पृष्ठभूमि कार्यकर्ता थ्रेड को इसके कन्स्ट्रक्टर में सेवा में इंजेक्ट करने के लिए? क्या मुझे विपरीत नहीं करना चाहिए? पृष्ठभूमि कार्यकर्ता के निर्माता में सेवा इंजेक्ट करें? –

+0

@ जॉनमिनर, सुनिश्चित नहीं है कि आपके लिए पृष्ठभूमि कार्यकर्ता की आवश्यकता है। मैंने एक छोटा सा उदाहरण लिखा है। –

+0

वाह, व्यापक उदाहरण के लिए धन्यवाद! मैं यह बताने की कोशिश करूंगा कि मुझे कार्यकर्ता धागे की आवश्यकता क्यों है। डेटाबेस में एक सारणी है जिसमें प्रत्येक उपयोगकर्ता के लिए नियम होते हैं - वह उत्पाद जो वह चाहता है। USER1 का एक नियम है जो कहता है कि वह "मूल्य> 50" वाले उत्पादों के बारे में सूचित होना चाहता है। USER2 का एक नियम है जो कहता है कि वह "मूल्य> 30 और मूल्य <70" वाले उत्पादों के बारे में सूचित होना चाहता है। USER3 का एक नियम है जो कहता है कि वह अपने नाम पर "खाद्य" वाले उत्पादों को चाहता है। अगली टिप्पणी में जारी रखें –

0

मेरा कहना है कि निम्नलिखित क्या है।

एक डब्ल्यूसीएफ सेवा बनाएं जिसे प्रत्येक ग्राहक द्वारा एक बार फ़िल्टर करने के लिए बुलाया जाएगा। डब्ल्यूसीएफ सेवा स्वयं डेटाबेस में डेटा जोड़ती है और डेटा स्टोर में क्लाइंट नाम और फ़िल्टर जानकारी जैसी जानकारी शामिल करती है। फिर आपका कार्यकर्ता धागा जो एक विंडो सेवा में होगा जो डेटा के लिए बस आपके डीबी को मतदान करेगा और जब डेटा उपलब्ध होगा तो यह सदस्यता तालिका से पढ़ेगा। इसके बाद डेटा को प्रत्येक क्लाइंट की कतार में धक्का दिया जाएगा जो rabbitmq जैसे साझा कतार सर्वर हो सकता है।

क्लाइंट पक्ष पर यह मानते हुए कि यह एक विंडो आधारित ऐप है, यह केवल अपने नाम (क्लाइंट 1, e.t.c) के साथ कतार में इसे देखकर डेटा के लिए rabbitmq कतार सर्वर को मतदान करेगा।

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