2011-08-05 13 views
5

मैं पीओसीओ का उपयोग कर प्रोटोटाइप ईएफ एप्लिकेशन पर काम कर रहा हूं। मुख्य रूप से ढांचे के परिचय के रूप में मैं एक अच्छी संरचना में आवेदन स्थापित करने के लिए एक अच्छा तरीका सोच रहा हूं। बाद में मैं इसमें डब्ल्यूसीएफ को शामिल करने की योजना बना रहा हूं।एक ईएफ अनुप्रयोग की संरचना सेट करना

मैंने क्या किया गया है निम्नलिखित है:

1) मैं एक edmx फ़ाइल बनाया है, लेकिन कोड पीढ़ी संपत्ति के साथ कोई नहीं पर सेट और मेरे डेटाबेस स्कीमा उत्पन्न,

2) मैं Pocos बनाया जो सभी की तरह लग रहे:

public class Person 
{ 
    public Person() 
    { 
    } 

    public Person(string firstName, string lastName) 
    {   

     FirstName = firstName; 
     LastName = lastName; 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

3) मैं एक संदर्भ बनाया

public class PocoContext : ObjectContext, IPocoContext 
{ 
    private IObjectSet<Person> persons; 

    public PocoContext() : base("name=PocoContainer", "PocoContainer") 
    { 
     ContextOptions.LazyLoadingEnabled = true; 
     persons= CreateObjectSet<Person>(); 
    } 

    public IObjectSet<Person> Persons 
    { 
     get 
     { 
      return persons; 
     } 
    } 

    public int Save() 
    { 
     return base.SaveChanges(); 
    } 
} 

इंटरफ़ेस इस तरह दिखता है:

public interface IPocoContext 
{ 
    IObjectSet<Person> Persons { get; } 

    int Save(); 
} 

4) अंत में मैं एक भंडार बनाया है, एक अंतरफलक को लागू करने:

public class PersonRepository : IEntityRepository<Person> 
{ 
    private IPocoContext context; 

    public PersonRepository() 
    { 
     context = new PocoContext(); 
    } 

    public PersonRepository(IPocoContext context) 
    { 
     this.context = context; 
    } 

    // other methods from IEntityRepository<T> 
} 

public interface IEntityRepository<T> 
{ 
    void Add(T entity); 
    List<T> GetAll(); 
    T GetById(int id); 
    void Delete(T entity); 

} 

अब, जब मैं इस के साथ प्रयोग करना पर मिलता है, इस डिजाइन मुझे तय दृष्टांत के लिए एक हर बार जब मैं लाने या कुछ डेटा उत्परिवर्तित करने के लिए, इस तरह चाहते हैं भंडार:

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

किसी तरह यह सिर्फ गलत और त्रुटिपूर्ण लगता है, दूसरे हाथ पर, सिर्फ डी में हर भंडार instantiating rived संदर्भ संभावित रूप से तत्काल वस्तुओं की वजह से बहुत अच्छा महसूस नहीं करता है, मुझे शायद इसकी आवश्यकता नहीं है।

इस डिजाइन को कैसे बनाया जाए इस पर कोई सुझाव? क्या मुझे इसे इस तरह से छोड़ना चाहिए? ऐसा करने पर मुझे किसी चीज को सामान्य रूप से जोड़ना या टालना चाहिए?

+0

यह किस प्रकार का एप्लिकेशन है। वेबसाइट सेवा, डब्ल्यूपीएफ-ऐप, कुछ और? – alun

+0

इस स्थिति में यह केवल एक कंसोल एप्लिकेशन है, क्योंकि यह केवल एक नंगे-न्यूनतम प्रोटोटाइप है। – duress

+1

कारण मैं पूछता हूं कि आप अपने संदर्भ को कैसे संभालेंगे, आवेदन के प्रकार से काफी प्रभावित है। उदाहरण के लिए एक डब्ल्यूपीएफ ऐप में प्रति फॉर्म एक संदर्भ और एक वेब ऐप में प्रति http एक अनुरोध और एक webservice में एक विधि प्रति विधि कॉल के लिए एक संदर्भ है। – alun

उत्तर

2

मैं इस हिस्से समझ में नहीं आता:

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

आप बाहरी दायरे में संदर्भ क्यों बना रहे हैं तो आप पैरामीटर के रूप में संदर्भ गुजर बिना भंडार निर्माता कहते हैं? कई संदर्भों का उपयोग करने से चीजें केवल कठिन हो जाएंगी। इसके अलावा भंडार के लिए इंटरफेस बनाने और इसे छिपाने की कोशिश करने का क्या मतलब है यदि आपका बाहरी ब्लॉक सिर्फ वर्ग का उदाहरण बनायेगा?

क्या आपका दृष्टिकोण सही है? आम तौर पर हाँ। आपको single context for logical operation (काम की इकाई) का उपयोग करना चाहिए और यदि आपके भंडार को कन्स्ट्रक्टर के माध्यम से संदर्भ मिलता है तो आपको प्रत्येक संदर्भ के लिए रिपॉजिटरीज़ का एक नया सेट बनाने की आवश्यकता होती है। यह आमतौर पर निर्भरता इंजेक्शन के माध्यम से हासिल किया जाता है।

सिर्फ इसलिए कि संभावित instantiating वस्तुओं मैं बिल्कुल की आवश्यकता न पड़े की, व्युत्पन्न संदर्भ या तो बहुत अच्छा महसूस नहीं करता है में हर भंडार instantiating।

खैर इस आलसी आरंभीकरण द्वारा सुंदर आसानी से हल किया जा सकता है:

private SomeRepositoryType _someRepository 
public SomeRepositoryType SomeRepository 
{ 
    get { _someRepository ?? (_someRepository = new SomeRepositoryType(context)) } 
} 

लेकिन मैं संदर्भ ही में डाल नहीं होगा।मैं शायद इसे कुछ डेटा एक्सेस फैक्ट्री में उपयोग करूँगा क्योंकि यह संदर्भ के बाहर होना चाहिए और एकल कारखाना पास करना चाहिए क्योंकि एकाधिक रिपॉजिटरीज़ का उपयोग करके कक्षाओं/विधियों के इंजेक्शन सरल है।

बीटीडब्ल्यू। what value क्या आप भंडार का उपयोग करने से प्राप्त करेंगे?

+0

मैंने आपकी पोस्ट पढ़ने के बाद इसके बारे में सोचा और उम्मीद है कि आप जो कहने जा रहे हैं उस पर टिप्पणी कर सकते हैं। सबसे पहले, यह प्रोजेक्ट मुख्य रूप से एक ट्यूटोरियल से प्रेरित है और दोपहर के भोजन के दौरान मैं खुद से यही सवाल पूछ रहा था कि इस विषय के स्टार्टर ने क्या किया था। भंडार सिर्फ एक अतिरिक्त परत जोड़ते हैं जिसे मैं AddObject (या जो कुछ भी) कहते हैं। उस ने कहा, मुझे लगता है कि मैं वास्तव में सोचता हूं कि इस समय से इसका लाभ नहीं है ... – duress

1

यदि आप अपने डेटाबेस के मॉडल बनाने के लिए पीओसीओ का उपयोग करते हैं, तो पहले ईएफ कोड आज़माएं? कोड फर्स्ट का उपयोग कर आईएमएचओ डिजाइनर में ईडीएमएक्स मॉडल बनाने से अधिक स्पष्ट रूप से है।

+0

हाँ यह है, लेकिन इस मामले में मैं कुछ सामान चुन सकता हूं कि एडीएमएक्स कैसे स्थापित किया गया है। – duress

+0

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

0

प्रति अनुरोध ऑब्जेक्ट संदर्भ प्रदान करके कैसल विंडसर, ऑटोफैक, आदि जैसे किसी भी कंटेनर का उपयोग करके निर्भरता इंजेक्शन का उपयोग करें।

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