2011-04-07 5 views
7

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

मेरे पास कई रिपोजिटरी हैं, उदाहरण के लिए, ग्राहक, ऑर्डर इत्यादि। काम की मेरी इकाई या तो एक आईएसएशन या ऑब्जेक्ट कॉन्टेक्स्ट होगा, जिसके आधार पर मैं किस डीएएल के साथ परीक्षण करना चाहता हूं।

मेरे व्यापार परत एक भी व्यापार प्रणाली शामिल हैं - 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 विधि की शुरुआत में काम की एक ही इकाई को खोलना।

व्यापार परत के भीतर काम करते हैं और खजाने की इकाई का उपयोग करने के लिए सही तरीका क्या है?

उत्तर

1

मेरे लिए ऐसा लगता है कि लगभग यह मिल गया है। हमारे नए सर्वर स्टैक में मेरे पास यह सेटअप है:

WCF Service Layer --> just returns results from my Business Layer 

My business layer is called, creates a unitofwork, creates the respository 
Calls the respository function 
Uses AutoMapper to move returned results into a DTO 

My repository gets the query results and populates a composite object. 

ऐसा लगता है कि आप वहां क्या मिला है। यद्यपि हम व्यापार परत को कॉल करने के लिए एकता का उपयोग करते हैं। (हम इसे सिर्फ हमारे फ़ंक्शन प्रोसेसर कहते हैं)

हालांकि, मैं यह सुझाव दूंगा कि आप यूनिटऑफवर्क को कक्षा स्तर पर नहीं रखते हैं। सभी descreet समारोह काम की एक इकाई के बाद। तो मेरा (नाम मासूम की रक्षा करने के लिए बदल दिया गया है) इस तरह है:

 using (UnitOfWorkScope scope = new UnitOfWorkScope(TransactionMode.Default)) 
     { 
      ProcessRepository repository = new ProcessRepository(); 
      CompositionResultSet result = repository.Get(key); 
      scope.Commit(); 

      MapData(); 
      return AutoMapper.Mapper.Map<ProcessSetDTO>(result); 
     } 

हम भी जब एक scope.Commit करने के बारे में एक लंबे चर्चा की थी और जब तक यह प्रश्नों के लिए की जरूरत नहीं है, यह स्थापित करता है आवेदन परत में प्रत्येक समारोह के लिए एक सतत पैटर्न। बीटीडब्ल्यू हम अपने भंडार/इकाई कार्य पैटर्न के लिए एनसीओएमओएन का उपयोग कर रहे हैं और यूओडब्ल्यू को भंडार में पास करने की आवश्यकता नहीं है।

0

आपके IUnitOfWork कार्यान्वयन में सभी भंडार शामिल हैं।

आपका IUnitOfWork आपकी प्रस्तुति परत में एमवीसी नियंत्रक की तरह इंजेक्शन दिया गया है।

आपका IUnitOfWork एमवीसी नियंत्रक में इंजेक्शन दिया गया है।

आपकी आईरपॉजिटरी को आपके यूनिटऑफवर्क कार्यान्वयन में इंजेक्शन दिया गया है।

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