कार्य/भंडार पैटर्न के यूनिट का उपयोग कर एक छोटा सा आवेदन बनाया करने के बाद, मैं समझता हूँ कि कैसे अपने व्यवसाय परत के भीतर ठीक से इस का उपयोग करने के लिए संघर्ष कर रहा हूँ। मेरे एप्लिकेशन में डेटा एक्सेस लेयर है जो या तो एनएचबीर्नेट या इकाई फ्रेमवर्क हो सकती है। मैं इनके बीच आसानी से स्विच कर सकता हूं।व्यापार परत के भीतर कार्य/डेटा संग्रह स्थान की इकाई का उपयोग करने के लिए सही तरीका क्या है?
मेरे पास कई रिपोजिटरी हैं, उदाहरण के लिए, ग्राहक, ऑर्डर इत्यादि। काम की मेरी इकाई या तो एक आईएसएशन या ऑब्जेक्ट कॉन्टेक्स्ट होगा, जिसके आधार पर मैं किस डीएएल के साथ परीक्षण करना चाहता हूं।
मेरे व्यापार परत एक भी व्यापार प्रणाली शामिल हैं - CreateOrder()। मैं समझने के लिए संघर्ष कर रहा हूं कि व्यापार स्तर में मुझे अपनी कार्य इकाई और मेरे भंडारों को शुरू करना चाहिए।
Nhibernate पर ध्यान केंद्रित मेरी दाल लगता है:
public class NHibernateDAL : IUnitOfWork
{
log4net.ILog log = log4net.LogManager.GetLogger(typeof(NHibernateDAL));
ISession context;
public NHibernateDAL()
{
context = SessionProvider.OpenSession();
this.Context.BeginTransaction();
CurrentSessionContext.Bind(context);
}
public ISession Context
{
get { return context; }
}
public void Commit()
{
this.Context.Transaction.Commit();
context.Close();
}
public void Dispose()
{
ISession session = CurrentSessionContext.Unbind(SessionProvider.SessionFactory);
session.Close();
}
}
मेरे व्यापार परत के भीतर, मुझे पता है कि मैं कहाँ काम और खजाने की मेरी यूनिट घोषित किया जाना चाहिए चाहते हैं। क्या वे कक्षा के स्तर पर या CreateOrder विधि के भीतर घोषित किए गए हैं?
उदाहरण के लिए:
public class BusinessLogic
{
UnitOfWork _unitOfWork = new UnitOfWork(NHibernateDAL);
NhRepository<Order> _orderRepository = new NhRepository<Order>(_unitOfWork);
NhRepository<Customer> _customerRepository = new NhRepository<Customer>(_unitOfWork);
....
public void CreateOrder(.....)
{
Order order = new Order();
_orderRepository.Add(order);
_unitOfWork.Commit();
}
}
ऊपर कोड आगामी कॉल के लिए केवल पहली बार CreateOrder() विधि कहा जाता है के लिए काम करता है, लेकिन नहीं है क्योंकि सत्र बंद कर दिया है। मैंने लेनदेन करने के बाद 'context.Close()' कॉल को हटाने का प्रयास किया है लेकिन यह भी विफल रहता है। यद्यपि उपरोक्त दृष्टिकोण काम नहीं करता है, लेकिन मेरे दायरे और काम की इकाई को इस दायरे के साथ घोषित करने के लिए मेरे लिए यह सही लगता है।
हालांकि, अगर मैं इसे नीचे के रूप में लागू करने के बजाय यह ठीक काम करता है, लेकिन यह विधि खुद के दायरे के भीतर खजाने और काम की इकाई घोषित करने के लिए अप्राकृतिक लगता है। अगर मैं व्यापार के तरीकों की एक टन था तो मैं हर जगह खजाने और कार्य की इकाइयों की घोषणा होगा:
public class BusinessLogic
{
public void CreateOrder(.....)
{
UnitOfWork _unitOfWork = new UnitOfWork(NHibernateDAL);
var _orderRepository = new NhRepository<Order>(_unitOfWork);
NhRepository<Customer> _customerRepository = null;
Order order = new Order();
_orderRepository.Add(order);
_unitOfWork.Commit();
}
}
अगर मैं तो मुझे लगता है कि मैं फिर से के कुछ साधन की आवश्यकता होगी श्रेणी स्तर घोषणा के साथ इस लागू करने के लिए थे CreateOrder विधि की शुरुआत में काम की एक ही इकाई को खोलना।
व्यापार परत के भीतर काम करते हैं और खजाने की इकाई का उपयोग करने के लिए सही तरीका क्या है?