6

क्या प्रति-फ़ाइल/प्रोजेक्ट-आइटम आधार पर एक कंपाइलर निरंतर परिभाषित करना संभव है?सी # कंपाइलर निरंतर एक PER-FILE आधार पर?

पृष्ठभूमि: मैं एक डाटाबेस एब्स्ट्रक्शन लेयर (डीएएल) प्राप्त करना चाहता हूं, जो सभी को पढ़ता है, और कार्यों को लिखता है, लेकिन एक डीएएल बनाए रखता है जो दोनों कर सकता है, लेकिन एक ही तरीके को कई बार लागू किए बिना (अमूर्त वर्ग का अर्थ है प्रत्येक समर्थित डेटाबेस प्रकार के लिए 1 इंस्टेंस क्लास होगा)। दुर्भाग्य से

abstract class ReadDAL 
abstract class WriteDAL 
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL). 

, कि, काम नहीं करता है, क्योंकि सी # बहु उत्तराधिकार का समर्थन नहीं करता:

तो मैं इस तरह मेरी दाल को अलग करना चाहते।

तो इस समस्या को हल एक ही रास्ता को परिभाषित इंटरफेस द्वारा होगा:

abstract class ReadDAL : IReadDAL 
abstract class WriteDAL : IWriteDAL 
abstract class ReadWriteDAL : IReadDAL, IWriteDAL 

हालांकि, अगर मैं यह कर, मैं इंटरफ़ेस परिभाषा हर बार जब मैं दाल से एक में एक पद्धति को बदलने बदलना होगा , और ReadWriteDAL में परिभाषित विधियों को बदलें, और मुझे कहीं भी विधि कार्यान्वयन की प्रतिलिपि बनाना है, जिसका अर्थ है कि एक DRY-noncompliance गड़बड़ होगी।

मैं सोचा मैं एक ही फाइल कड़ी के रूप में दूसरी बार जोड़ने गया था, और एक एक प्रति परियोजना मद आधार पर परिभाषित होने क्या कर सकता है:

#if SOMECONSTANT // true if file is PartialReadDAL.cs 
public partial abstract class ReadDAL 
#else // false if "file" is link called "PartialReadWriteDAL.cs" symlinking to PartialReadDAL.cs 
public partial abstract class ReadWriteDAL 
#endif 
and here some implementation. 

लेकिन मैं किसी भी तरह एक संकलक निरंतर प्रति परिभाषित कर सकते हैं फाइल?
या किसी भी तरह का एक समान प्रभाव प्राप्त करते हैं?

+0

क्या आप इंटरफेस पर विस्तार विधियों के रूप में अपने तरीकों को कार्यान्वित कर सकते हैं? –

+0

@ लुकास Trzesniewski: सबसे पहले, मैं विस्तार विधियों नहीं चाहता। दूसरा शायद नहीं, भले ही मैं चाहता था। –

+0

आइडिया: एक टी 4 टेम्पलेट से 'ReadWriteDAL' उत्पन्न करें जो' रीडडाल 'और' WriteDAL' को अग्रेषण विधियों को उत्पन्न करता है (जिनके उदाहरण कन्स्ट्रक्टर को पास किया जा सकता है, या उपयुक्त डिफ़ॉल्ट मानते हैं)। संक्षेप में, 'ReadWriteDAL' में कोई रोचक कोड नहीं है, इसलिए यह संभवतः कंप्यूटर द्वारा लिखा जा सकता है। एक और विचार जिसमें कोड जनरेशन शामिल नहीं है: 'ReadWriteDAL' अंतर्निहित रूपांतरण ऑपरेटर को '(i) ReadDAL' और' (I) WriteDAL' दें जो केवल उचित उदाहरण लौटाते हैं। यह वास्तविक चीज़ के रूप में काफी अच्छी तरह से प्रतिस्थापित नहीं करता है, लेकिन यह करीब है। दोनों विचार रचना पर भरोसा करते हैं। –

उत्तर

0

सिम्लिंक मार्ग बहुत भ्रमित होगा। इसे करने में मजबूर होने पर, मैं कुछ #define एस को प्रीबिल्ड चरण के रूप में प्रासंगिक फ़ाइलों में प्रीपेड करके कार्यान्वित करता हूं। तो मैं कोड में इन प्रतीकों की उपस्थिति पर #if होगा। मुझे यह बिल्कुल पसंद नहीं होगा: मेरा अनुमान है कि यह उतना पारदर्शी नहीं होगा जितना मैं चाहता हूं कि अगर मैं बिल्डर्स के अंत के बाद इस मार्कर को साफ़ कर दूं तो यह संस्करण नियंत्रण में नहीं मिलेगा।

ReadWriteDAL है कि इसमें कुछ राज्य शामिल है, या यह ReadDAL और WriteDAL में विधि कॉल के लिए केवल एक प्रेषक होगा? यदि यह केवल एक प्रेषक है, तो आप वास्तविक कार्यान्वयन (ReadWriteDAL) को छोड़ने और का उपयोग करके संरचना रूट में पंजीकृत के रूप में IReadDAL और IWriteDAL पर कॉल पास करने पर विचार कर सकते हैं। मैंने कैसल विंडसर के लिए a tool like that लिखा था।

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