2010-01-15 13 views
13

मेरे पास NHibernate का उपयोग करके एक रिपोजिटरी पैटर्न सेटअप है। आधार वर्ग इस तरह दिखता है:काम की इकाई और भंडार पैटर्न

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

// generic NHibernate implementation of IUnitOfWork here 

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    private NHibernateUnitOfWork _unitOfWork; 

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
    public T Get(object id) 
    { 
     return _unitOfWork.Session.Get<T>(id); 
    } 

    // ... 
} 

आप देख सकते हैं, मैं कर रहा हूँ की इजाजत दी काम की इकाई निर्माता के माध्यम से आबादी होने के लिए (StructureMap का उपयोग)। मैं बहुत तरह मेरे ASP.NET वेब सेवाओं पर भंडार वस्तुओं को आबाद करने हूँ:

[WebService(Namespace = "...")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class ModuleService : System.Web.Services.WebService 
{ 
    public IUserAccountRepository UserAccountRepo { get; set; } 

    public ModuleService() 
    { 
     // tell IoC to inject properties 
     ObjectFactory.BuildUp(this); 
    } 

    // ... 
} 

आप अनुमान करने में सक्षम हो सकता है, मेरी समस्या यह है कि डिजाइन के माध्यम से, मैं अब नियंत्रण जीवन चक्र के खो दिया है है काम की इकाई का। इससे पहले, मैं काम की इकाई एक संदर्भ संवेदनशील वस्तु बना दिया है और भंडार की तरह कुछ के माध्यम से इसे करने के लिए एक संदर्भ प्राप्त होगा:

public class NHibernateRepositoryBase<T> : IRepository<T> 
{ 
    public T Get(object id) 
    { 
     return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id); 
    } 

    // ... 
} 

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

उत्तर

3

आमतौर पर आपके आईओसी कंटेनर को जितना संभव हो सके हैं, यह एक अच्छी बात है। वेब पर कार्य पैटर्न की एक इकाई आमतौर पर अनुरोध की शुरुआत में शुरू होती है और अंत में प्रतिबद्ध होती है (यदि कोई अपवाद है तो वापस लुढ़काया जाता है)। इस तरह आपकी रिपोजिटरी इकाई के काम के बजाय कन्स्ट्रक्टर में एक ISession ले जाएगी। इस तरह, आपके भंडार को कम करने या कुछ भी करने का सामना नहीं करना पड़ेगा और यह आपके लिए स्वचालित रूप से संभाला जाएगा।

+0

हालांकि आप उस प्रकार के सेट अप में व्यक्तिगत लेन-देन कैसे संभालेंगे? मान लें कि मुझे उसी सत्र में कोड के दो अलग-अलग सेट चलाने की ज़रूरत है, और प्रत्येक के पास इसका अपना लेनदेन है। आप इसे संभालने की सिफारिश कैसे करेंगे? – Chris

+0

लेनदेन सत्र के माध्यम से संभाला जाता है। किसी लेनदेन का उपयोग करने के लिए सत्र संदर्भ के बाद आपको किसी और चीज की आवश्यकता नहीं है। –

+3

एनएचबीर्नेट सत्र मूल रूप से स्वयं की एक इकाई है। कार्य इंटरफ़ेस की अपनी इकाई के पीछे इसे छिपाने का कारण मूल रूप से है ताकि आप इसे शेष एप्लिकेशन (आपके भंडार के बाहर) के सामान्य तरीके से बेनकाब कर सकें और NHibernate पर निर्भर न हों। और यह ज्यादातर अनुरोध की शुरुआत में इसे शुरू करना होगा और अंत में इसे प्रतिबद्ध करेगा। –

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