2010-07-16 13 views
6

इस बार मेरे पास एक और दार्शनिक सवाल है।एमवीसी: बेहतर क्या है, प्रति डीबी या प्रति व्यवसाय इकाई में एक बड़ा भंडार?

अधिकांश एमवीसी ट्यूटोरियल/पुस्तकें मॉडल के एक पहलू पर एक भंडार के दायरे को सीमित करने और सभी मॉडल वर्गों को कवर करने के लिए एकाधिक भंडार स्थापित करने का सुझाव देती हैं। (उदाहरण: ProjectRep, UserRep, ImageRep, अंततः एक ही डीबी पर सभी मैपिंग।)

मैं देख सकता हूं कि यह कैसे बेकार आसान होगा लेकिन मैं कल्पना नहीं कर सकता कि यह असली दुनिया में कैसे काम करेगा, जहां अधिकांश संस्थाएं हैं एक दूसरे के बीच संबंध। अंत में मैं हमेशा खुद को एक विशाल भंडार वर्ग प्रति डीबी कनेक्शन और एक समान रूप से arkward FakeRepository के साथ unittesting के लिए मिलते हैं।

तो, आपकी राय क्या है? क्या मुझे रिपोजिटरी को अलग करने की कोशिश करनी चाहिए? क्या इससे कोई फर्क नहीं पड़ता कि ProductRep UserRep में डेटा को संदर्भित करता है और इसके विपरीत खरीद इतिहास के माध्यम से? अलग-अलग प्रतिनिधि यह सुनिश्चित करते हैं कि एकल डीबी तक पहुंचने पर वे एक-दूसरे को लॉक न करें?

धन्यवाद, डफी

उत्तर

3

यह असली दुनिया में काम करता है क्योंकि भंडार के हुड के नीचे एक इंजन है। यह ओआरएम एनएचबीरनेट या आपके स्वयं के समाधान की तरह हो सकता है। यह इंजन जानता है कि ऑब्जेक्ट्स को कैसे लॉन्च करें, डेटाबेस लॉक करें, कैश अनुरोध इत्यादि। लेकिन बिजनेस कोड को इन बुनियादी ढांचे के विवरणों को नहीं जानना चाहिए।

एक विशालकाय भंडार के साथ समाप्त होने पर आप प्रभावी ढंग से क्या करते हैं, इस इंजन को वास्तविक दुनिया में उजागर कर रहा है। इस प्रकार आप अपने डोमेन कोड को इंजन-विशिष्ट विवरण के साथ गड़बड़ करते हैं जो अन्यथा भंडार इंटरफेस के पीछे छिपा हुआ है।

S#arp Architecture यह एक बहुत अच्छा उदाहरण है कि जोश जो बात करते हैं, उन्हें लागू और काम कैसे किया जाता है। NHHernate सर्वोत्तम प्रथाओं article को भी पढ़ें जो एस # एआरपी पृष्ठभूमि की अधिक जानकारी देता है।

और स्पष्ट रूप से, मैं कल्पना नहीं कर सकता कि असली दुनिया में आपका विशाल भंडार कैसे काम करता है। क्योंकि बहुत ही बुरा बुरा और अनजान दिखता है।

+0

आपके विचारशील प्रतिक्रियाओं के लिए धन्यवाद। काश मैं उन सभी को जवाब के रूप में चिह्नित कर सकता हूं। मुझे लगता है कि मैं डोमेन मॉडल और डीबी के बीच 1: 1 मैपिंग पर भी लटका हुआ था, लेकिन जैसा कि आप सभी बताते हैं, दोनों अलग-अलग जानवरों को पूरी तरह से कर सकते हैं। ऐसा लगता है कि मुझे ओआरएम पर थोड़ा और पढ़ने की आवश्यकता होगी – duffy

2

मैं पाया है कि जेनरिक और एक अंतरफलक का उपयोग करके, आप कई अलग खजाने कोड करने के लिए होने से बचने कर सकते हैं। यदि आपका डोमेन मॉडल अच्छी तरह से फैक्टर है, तो आप अक्सर अन्य ऑब्जेक्ट्स के बजाय डोमेन ऑब्जेक्ट्स का उपयोग करके ऑब्जेक्ट ग्राफ़ को नेविगेट कर सकते हैं।

public class MyDomainObject : IEntity //IEntity is an arbitrary interface for base ents 
{ 
    public int Id { get; set;} 
    public List<DiffObj> NavigationProp { get; set;} 
    //... and so on... 
} 

public interface IRepository<T> where T : IEntity, class, new() 
{ 
    void Inert(T entity); 
    T FindById(int id); 
    //... and so on 
} 

उपयोग बहुत आसान है, और आईओसी का उपयोग करके आप पूरी तरह से अपने आवेदन के बाकी हिस्सों से कार्यान्वयन दसगुणा कर सकते हैं:

public class MyBusinessClass 
{ 
    private IRepository<SomeDomainObject> _aRepo; 
    public MyBusinessClass(IREpository<SomeDomainObject> aRepo) 
    { 
      _aRepo = aRepo; 
    } 
    //...and so on 
} 

इस इकाई लेखन एक असली तस्वीर का परीक्षण करती है बनाता है।

+1

नियंत्रकों को प्रबंधित करने के लिए आईओसी के साथ इसे कार्यान्वित करने के लिए इस उत्तर को देखें - http://stackoverflow.com/questions/2797047/how-do-i-correctly-use-unity-to-pass-a -कनेक्शनस्ट्रिंग-टू-माय-रिपोजिटरी-क्लासेस/2797264 # 2797264 –

+0

मैं एकता का प्रशंसक हूं - esp। 2.0 में किए गए सुधारों के साथ। मैंने इसे एमवीसी परियोजनाओं में ठीक से करने के लिए उपयोग किया है। –

+0

इसे +1 करें। याद रखें, एक आईरिपॉजिटरी <> यह नहीं जानता कि यह कैसे कार्यान्वित किया गया है, और न ही कॉलर करता है। कॉलर सिर्फ मॉडल ऑब्जेक्ट चाहता है। यदि आप अपने आईआरपीository <> कार्यान्वयन के लिए ओआरएम का उपयोग करते हैं, तो यह आपके लिए सभी एफके लोडिंग का ख्याल रखेगा। यदि नहीं, तो आप इसे तब भी कर सकते हैं जब आप मैन्युअल रूप से चाहते हैं, जब तक कि इंटरफ़ेस परिवर्तित न हो और कार्यान्वयन के लिए इंटरफ़ेस का कोई युग्मन न हो। –

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