मेरे पास 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);
}
// ...
}
यह पिछले डिजाइन मुझे मेरे कोड में काम की इकाई के जीवन चक्र को नियंत्रित करने की अनुमति दी एक उपयोग कथन के भीतर एक यूनिटऑफवर्क फैक्टरी से काम की इकाई बनाकर। मैं आईओसी कंटेनर के हाथों में अधिक काम करने की कोशिश कर रहा था, लेकिन मुझे लगता है कि मैंने वास्तव में एक कदम पीछे की ओर ले लिया। या तो कार्यान्वयन पर आपके विचार क्या हैं?
हालांकि आप उस प्रकार के सेट अप में व्यक्तिगत लेन-देन कैसे संभालेंगे? मान लें कि मुझे उसी सत्र में कोड के दो अलग-अलग सेट चलाने की ज़रूरत है, और प्रत्येक के पास इसका अपना लेनदेन है। आप इसे संभालने की सिफारिश कैसे करेंगे? – Chris
लेनदेन सत्र के माध्यम से संभाला जाता है। किसी लेनदेन का उपयोग करने के लिए सत्र संदर्भ के बाद आपको किसी और चीज की आवश्यकता नहीं है। –
एनएचबीर्नेट सत्र मूल रूप से स्वयं की एक इकाई है। कार्य इंटरफ़ेस की अपनी इकाई के पीछे इसे छिपाने का कारण मूल रूप से है ताकि आप इसे शेष एप्लिकेशन (आपके भंडार के बाहर) के सामान्य तरीके से बेनकाब कर सकें और NHibernate पर निर्भर न हों। और यह ज्यादातर अनुरोध की शुरुआत में इसे शुरू करना होगा और अंत में इसे प्रतिबद्ध करेगा। –