2010-04-06 12 views
13

मैं वर्तमान में एक मध्यम आकार आवेदन है, जो 2 या अधिक SQL डेटाबेस का उपयोग करेंगे, विभिन्न साइटों आदि पर विकसित कर रहा हूँ के साथ एक सामान्य भंडार पैटर्न का उपयोग करना ...धाराप्रवाह NHibernate

मैं यह करने के लिए कुछ इसी तरह का उपयोग कर पर विचार कर रहा हूँ: http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html

हालांकि, मैं Linq करने वाली एसक्यूएल (और निश्चित रूप से nHibernate.Linq) के स्थान पर धाराप्रवाह nHibernate, का उपयोग करना चाहते

इस व्यवहार्य है?

मैं इसे कॉन्फ़िगर करने के बारे में कैसे जाऊं? मेरी मैपिंग परिभाषा कहां जायेगी ...?

वेबूआई, डब्ल्यूसीएफ लाइब्रेरी और विंडोज अनुप्रयोगों/सेवाओं से इस एप्लिकेशन में अंततः कई पहलू होंगे।

इसके अलावा, एक "उत्पाद" मेज पर उदाहरण के लिए, मैं एक "ProductManager" वर्ग, है कि जैसे तरीकों बनाना होगा:

GetProduct, GetAllProducts आदि ...

किसी भी संकेत दिए गए बहुत प्राप्त कर रहे हैं।

+7

बस एक sidenote: Fluent NHibernate NHibernate मैपिंग को कॉन्फ़िगर करने का एक तरीका है; यह एक अलग ढांचा नहीं है और इसका भंडार कार्यान्वयन के साथ कुछ लेना देना नहीं है। –

उत्तर

22

मेरी राय में (और कुछ अन्य लोगों की राय में भी), एक भंडार एक इंटरफ़ेस होना चाहिए जो एक इंटरफ़ेस में डेटा एक्सेस छुपाता है जो संग्रह इंटरफ़ेस की नकल करता है। यही कारण है कि एक संग्रह एक IQueryable और IEnumerable होना चाहिए।

public interface IRepository<T> : IQueryable<T> 
{ 
    void Add(T entity); 
    T Get(Guid id); 
    void Remove(T entity); 
} 

public class Repository<T> : IQueryable<T> 
{ 
    private readonly ISession session; 

    public Repository(ISession session) 
    { 
    session = session; 
    } 

    public Type ElementType 
    { 
    get { return session.Query<T>().ElementType; } 
    } 

    public Expression Expression 
    { 
    get { return session.Query<T>().Expression; } 
    } 

    public IQueryProvider Provider 
    { 
    get { return session.Query<T>().Provider; } 
    } 

    public void Add(T entity) 
    { 
    session.Save(entity); 
    } 

    public T Get(Guid id) 
    { 
    return session.Get<T>(id); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
    return this.GetEnumerator(); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
    return session.Query<T>().GetEnumerator(); 
    } 

    public void Remove(T entity) 
    { 
    session.Delete(entity); 
    } 
} 

मैं, भंडार अपने आप में विधि की तरह एक SubmitChanges को लागू नहीं है क्योंकि मैं एक बार में कई उपयोगकर्ता से एक कार्रवाई के द्वारा प्रयोग किया खजाने की बदलाव जमा करना चाहते हैं।

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
    void RollBack(); 
} 

मैं खजाने के लिए सत्र के रूप में काम कार्यान्वयन का एक NHibernate विशिष्ट इकाई के सत्र का उपयोग करें::

public interface INHiberanteUnitOfWork : IUnitOfWork 
{ 
    ISession Session { get; } 
} 

कोई वास्तविक आवेदन में, मुझे लगता है मैं काम इंटरफेस की एक इकाई में लेन-देन प्रबंधन छिपाने पेजिंग, उत्सुक लोडिंग, विनिर्देश पैटर्न, केवल linq के बजाय NHiberante द्वारा उपयोग की जाने वाली पूछताछ के अन्य तरीकों तक पहुंच के तरीकों के साथ एक और जटिल भंडार इंटरफ़ेस का उपयोग करें। NHibernate ट्रंक में linq कार्यान्वयन मुझे करने के लिए आवश्यक अधिकांश प्रश्नों के लिए काफी अच्छा काम करता है।

+0

शानदार! सरल, IQueryable और काम की एक इकाई। यह वास्तव में भंडार पैटर्न "इन-मेमोरी डोमेन ऑब्जेक्ट संग्रह [...]" परिभाषा के अनुरूप है। कुछ डीआई जोड़ें और यह वास्तव में उपयोग करने योग्य हो जाता है!अच्छी नौकरी - :) – maxbeaudoin

+2

क्या हम देख सकते हैं कि "एक अधिक जटिल भंडार इंटरफ़ेस" कैसा दिखता है? यह अच्छा है, लेकिन मैं "लिग्नेशन, उत्सुक लोडिंग, विनिर्देश पैटर्न जैसी चीजें, केवल लिनक के बजाय एनएचबेरेंट द्वारा उपयोग की जाने वाली पूछताछ के अन्य तरीकों तक पहुंचने में सक्षम होना चाहूंगा"। साथ ही, यह उपयोगी होगा अगर आप यह दिखा सकें कि आप इसका उपयोग कैसे कर रहे हैं। अग्रिम धन्यवाद! – W3Max

+0

मैं जानबूझ कर हूं कि आप एनएचबर्ननेट के साथ अन्य पूछताछ विधियों का लाभ उठाने के लिए आईआरपीोजिटरी को कैसे परिभाषित कर रहे हैं - इसे सामान्य रखते हुए। –

1

यहाँ सामान्य खजाने पर मेरे विचार कर रहे हैं:

Advantage of creating a generic repository vs. specific repository for each object?

मैं सफलतापूर्वक NHibernate के साथ उस पैटर्न का इस्तेमाल किया है, और किसी भी वास्तविक कमियों नहीं मिली है।

यह बात यह है कि वास्तव में जेनेरिक रिपोजिटरी लाल हेरिंग का थोड़ा सा है, लेकिन समस्या के बारे में सोचकर थोड़ा अलग महसूस किया जा सकता है।

आशा है कि मदद करता है।

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