2013-03-07 5 views
7

मुझे निम्न समस्या है: मेरे पास इंजन का एक सेट है जो स्वचालित रूप से (ईवेंट सुनना) मेरे मॉडल को नियंत्रित करता है। निम्न चित्र सामान्य वर्ग चित्र में दिखाया गया है: Class Diagrammएक सरणी में बेस क्लास के कार्यान्वयन की पहचान

अब मैं एक ग्राहक जो EngineFacade जानता है और मैं ग्राहक से इंजन 2 से संपत्ति सक्रिय सेट करना चाहते हैं, लेकिन न तो ग्राहक है और न ही EngineFacade जानता है की जो तीन इंजन इंजन 2 है।

के दो तरीके हैं, लेकिन मैं उनमें से किसी को पसंद नहीं:

  1. जांच करें कि इंजन का एक प्रकार इंजन 2 की है - अगर वहाँ एक और वर्ग है जो एक ही काम करता है, लेकिन विभिन्न मैं नाम दिया गया है इसे इंजनबिल्डर और इंजनफेक में बदलने के लिए।
  2. पहचानकर्ता स्ट्रिंग के साथ जांचें - मुझे वास्तव में जादू तार पसंद नहीं है।

मुझे क्लाइंट साइट पर क्या पता है कि ग्रिड को संभालने वाला इंजन होना चाहिए या होना चाहिए। लेकिन मैं और नहीं जानता।

शायद मुझे दो शैतानों के बीच चयन करना होगा, लेकिन हो सकता है कि आप में से एक का बेहतर समाधान हो।

+1

यदि आपको प्रत्येक इंजन को अलग से पहचानना है, तो आसान विकल्प यह एक अद्वितीय पहचानकर्ता देना है। ऐसा करने का एक और तरीका बेस इंजन पर नाम संपत्ति होना है। प्रत्येक इंजन नाम संपत्ति लागू करता है और फिर एक घटना को आग लगाता है और फिर प्रेषक पैरामीटर की जांच करता है। –

+3

शायद आपको मुखौटा द्वारा प्रदान किए गए अमूर्तता की जांच करनी चाहिए। लगता है जैसे आपके पास कुछ रिसाव है। –

+0

हो सकता है कि आप अपने आरेख में क्लाइंट, इसकी विधियों और इसके चर शामिल करना चाहें, या उपयोग करने वाले कुछ कोड पोस्ट कर सकते हैं। –

उत्तर

1

आप Engine2 के कार्यान्वयन पर एक विशेषता इस्तेमाल कर सकते हैं, तो जैसे:

[AttributeUsage(AttributeTargets.Class)] 
public class HandlesGridAttribute : Attribute { } 

जो तुम तो अपने व्युत्पत्ति पर लागू होते हैं: अपने ग्राहक में

[HandlesGrid] 
public Engine2 : EngineBase { ... } 

फिर, विशेषता के लिए जाँच :

IEnumerable<EngineBase> bases = ...; 

// Get all the implementations which handle the grid. 
IEnumerable<EngineBase> handlesGrid = bases. 
    Where(b => b.GetType(). 
     GetCustomAttributes(typeof(HandlesGridAttribute), true).Any()); 

// Set the active property. 
foreach (EngineBase b in handlesGrid) b.Active = true; 

बड़ी खामी यहाँ (जो या यो पर लागू नहीं हो सकता है यू) यह है कि आप रनटाइम पर मान नहीं बदल सकते हैं (क्योंकि विशेषता संकलन समय में बेक जाती है)। यदि आपका इंजन इस तरह से गतिशील नहीं है, तो विशेषता जाने का सही तरीका है।

यदि आपको यह बदलने की आवश्यकता है कि कोई व्युत्पन्न रनटाइम पर यह क्रिया कर सकता है या नहीं, तो आपको अपने दूसरे विकल्प, कोड संरचनाओं पर वापस आना होगा जो इंजन की विशेषताओं की पहचान करते हैं। आपको याद है, इसे एक स्ट्रिंग नहीं होना चाहिए (और मुझे यह पसंद नहीं है), लेकिन यह ऐसा कुछ हो सकता है जो अधिक संरचित है जो आपको वह जानकारी देगा जो आप खोज रहे हैं।

+0

Thx, यही वह था जिसे मैं ढूंढ रहा था। मुझे केवल यह जांचना है कि यह कितना सक्षम है। – Yggdrasil

+0

ऐसा लगता है कि यह इतना महंगा नहीं है। बस अगर मैं इस इंजन को पकड़ता हूं जहां मैं इसका उपयोग करता हूं। – Yggdrasil

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