2013-11-14 4 views
8

मैं एक आवेदन के लिए एक दृश्य स्टूडियो समाधान में निम्नलिखित परियोजनाएं हैं:enums के साथ काम जब इंटरफेस अलग परियोजना में हैं

  • आम - उपयोगिता तरीकों और एक्सटेंशन
  • संस्थाओं - रिच डोमेन व्यापार तर्क विशिष्ट साथ वस्तुओं उदाहरणों को
  • डेटा संग्रह स्थान - डेटा डेटा संग्रह स्थान
  • DataServices - डेटा संग्रह स्थान को पतला आवरण, व्यापार तर्क एक उदाहरण
  • Interfac के लिए विशिष्ट नहीं होते हैं es - संस्थाओं और भंडारों के लिए सभी इंटरफेस

इंटरफेस को एक अलग परियोजना में डालने का कारण परिपत्र परियोजना संदर्भों से बचने का कारण है। यह दो परियोजनाओं को ठोस कार्यान्वयन के साथ परियोजना को संदर्भित करने से बचने के लिए एक सामान्य इंटरफ़ेस को संदर्भित करने की अनुमति देता है।

मैंने परिपत्र परियोजना संदर्भों से बचने के लिए इंटरफेस परियोजना में जानबूझकर कोई परियोजना संदर्भ नहीं बनाया है। मैं अन्य परियोजनाओं में परिभाषित कक्षाओं के लिए एक इंटरफ़ेस बनाता हूं, यह मुझे अन्य इंटरफेस में ठोस कार्यान्वयन के विरोध में ऑब्जेक्ट इंटरफ़ेस का संदर्भ देने की अनुमति देता है।

तो एक उदाहरण होगा:

namespace Acme.Entities 
{ 
    public class Person : IPerson 
    { 
     string Name { get; set; } 
    } 
} 
namespace Acme.Interfaces 
{ 
    public interface IPerson 
    { 
     string Name { get; set; } 
    } 
} 

namespace Acme.Interfaces 
{ 
    public interface ITeam 
    { 
     string Name { get; set; } 
     IPerson Leader { get; set; } 
    } 
} 

एक अंतरफलक एक enum एक अन्य परियोजना में परिभाषित का संदर्भ जब इस मुद्दे को मैं आई है है। इंटरफेस परियोजना के तहत Enums ले जाए बिना, मैं इस परियोजना के संदर्भ बनाए बिना Enums संदर्भित करने के लिए कैसे, उदाहरण के लिए यकीन नहीं है:

namespace Acme.Entities 
{ 
    public enum Status 
    { 
     Unknown =0, 
     Active = 1, 
     Active = 2  
    } 
} 

namespace Acme.Interfaces 
{ 
    public interface IPerson 
    { 
     string Name { get; set; } 
     Acme.Entities.Status ActiveStatus { get; set; } 
    } 
} 

Acme.Entities.Status जब तक कि मैं Acme.Entities परियोजना संदर्भ असफल हो जायेगी , लेकिन यह एक परिपत्र संदर्भ बनाएगा क्योंकि Acme.Entities इंटरफेस प्रोजेक्ट का संदर्भ देता है।

+4

इंटरफ़ेस प्रोजेक्ट में एनम को स्थानांतरित करने का विरोध क्यों किया जाता है? –

+0

मुझे यहां @DStanley के साथ जाना है। आप शायद अपने 'इंटरफेस' प्रोजेक्ट को 'सामान्य' में बदलना चाहते हैं। –

उत्तर

9

आपको या तो इंटरफेस प्रोजेक्ट में या एक अलग परियोजना के लिए एनम परिभाषा को स्थानांतरित करना होगा जो दोनों परियोजनाओं का संदर्भ है।

मैं व्यक्तिगत रूप से उन्हें एक ही प्रोजेक्ट में रखता हूं - केवल एक अलग परियोजना होने के कारण enums के लिए ओवरकिल लगता है।

+0

एक ही परियोजना में enums और interfaces डालने की दिशा में झुकाव, परियोजना के नाम पर किसी भी सुझाव "इंटरफेस" के बाद से परियोजना पूरी तरह से वर्णन नहीं करेगा? –

+0

"आम", जैसा कि @MichaelPerrenoud उल्लेख किया गया है, एक समझदार विकल्प प्रतीत होता है। – OnoSendai

+0

"डोमेन" मेरी पहली पसंद होगी। –

2

मैं कहूंगा कि आपके मूल डेटा प्रकार (enum एस, interface एस, और class es) सभी एक परियोजना में होना चाहिए। इस प्रकार, आपके Interfaces प्रोजेक्ट में यह enum, और कोई अन्य डेटा प्रकार सामान्य होना चाहिए (शायद abstract आधार प्रकार)। Entities में कार्यान्वयन-विशिष्ट आइटम होना जारी रखना चाहिए जो Interfaces में मूल चीज़ों का विस्तार और/या उपयोग करते हैं। आपके Common प्रोजेक्ट के साथ Interfaces को मर्ज करने का अर्थ भी हो सकता है, क्योंकि आम तर्क और सामान्य डेटा अक्सर एक साथ जाते हैं।

+0

यदि मैं इंटरफेस को आम परियोजना में डालता हूं, तो मैं एक ही समस्या में भाग लेता हूं, क्योंकि सर्कुलर संदर्भ मुद्दे से बचने के लिए मैं सामान्य में अन्य परियोजनाओं का संदर्भ नहीं देता हूं। –

+0

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

0

यदि आप अपने घटकों और इंटरफेस को सही तरीके से परिभाषित करते हैं तो आपको कभी भी यह समस्या नहीं मिलेगी।

मैं पहली बार सुझाव है कि यह दो सिद्धांतों के साथ अपने कोड और अपने आवेदन वास्तुकला की समीक्षा:

http://en.wikipedia.org/wiki/Single_responsibility_principle http://en.wikipedia.org/wiki/Interface_segregation_principle

डोमेन प्रेरित desgin ---> बहुत नपुंसक नियम: http://en.wikipedia.org/wiki/Domain-driven_design

मैं भी इस बात से सहमत इसके साथ आपको साझा किए गए एनम्स को एक सामान्य IConstants.cs पर ले जाना होगा। स्थिरांक स्थिरांक से कुछ और नहीं हैं;

+0

"Enums स्थिरांक से कुछ और नहीं हैं" वे सिर्फ स्थिरांक से अधिक हैं। –

+1

@DStanley यह एक दार्शनिक टिप्पणी है कुछ पीपीएल स्वीकार नहीं करते हैं और अन्य एनम्स को कॉन्स के संग्रह के रूप में देखते हैं और दूसरा ऐसा नहीं करते क्योंकि वे Enums आदि पर ऑपरेशन लागू कर सकते हैं। मैं इस चर्चा में शामिल नहीं होगा। –

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