2009-10-07 13 views
5

के निर्माण के लिए सबसे अच्छा तरीका मैं एनएचबर्ननेट (और ओआरएमएस) के लिए नया हूं और विभिन्न विकल्पों के असंख्य लोगों के साथ पकड़ने की कोशिश कर रहा हूं। संदर्भ के लिए, मैं अलग-अलग व्यावसायिक वस्तुओं के साथ फ्लुएंट एनएचबेर्नेट का उपयोग कर रहा हूं जो बदले में डेटा एक्सेस के लिए डीटीओ का उपयोग करता है। मेरे एप्लिकेशन आर्किटेक्चर को विंडोज़ और वेब दोनों "फ्रंट एंड्स" का समर्थन करना होगा।एनएचबेर्नेट डीटीओ के

मेरी क्वांड्री सामान्य दृष्टिकोण में से एक है क्योंकि ऐसा कई विकल्प प्रतीत होते हैं। मेरा डीटीओ नीचे नमूना की तरह कुछ दिखता है। प्रत्येक डीटीओ में एक आईएसशन का संदर्भ होता है जो उन्हें बीओ से पास किया जाता है। वे अपने स्वयं के भार के लिए जिम्मेदार हैं और बचाने:

सभी की
public class EmployeeDTO... 

    // Data Properties to be persisted to the database 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual ISession Session { get; set; } 

    // Save logic 
    public virtual void Save() 
    { 
     var transaction = Session.BeginTransaction(); 
     Session.SaveOrUpdate(this); 
     transaction.Commit(); 
    } 

    // Load logic 
    public virtual void Load(int id)... 

पहले: इस लेने के लिए सही दृष्टिकोण है - चाहिए डीटीओ बचाने के लिए और खुद को लोड करने की क्षमता है?

दूसरी बात: सहेजें/लोड कोड निहित है, तो आप जीवन या किसी वस्तु के लिए एक ही ISession का उपयोग करना चाहिए, या वे ISessionFactory करने के लिए एक रेफरी होना चाहिए और एक नया सत्र हर बार डाटाबेस संपर्क खोल सकते हैं जहां की परवाह किए बिना आवश्यक है?

// Open a new session every time I interact with the repository 
    var session = FluentSupport.SessionFactory.OpenSession(); 
    var transaction = Session.BeginTransaction(); 
    Session.SaveOrUpdate(this); 
    transaction.Commit(); 
    session.Close(); 
    // Close the session when I'm done 
बेशक

वहाँ हमेशा विकल्प 3, ऊपर :)

+0

एक वस्तु जानता है कि कैसे सहेजें करने के लिए अपने आप में डीएओ कहा जाता है, इस डीटीओ –

उत्तर

10

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

आईएसएशन आजीवन प्रबंधन के लिए, आपको यह तय करना होगा कि क्या आप यूनिटऑफवर्क पैटर्न का उपयोग करने जा रहे हैं, जो मूल रूप से कहता है कि प्रत्येक उपयोगकर्ता अनुरोध को एक नया आइसियाशन मिलता है। ISession जीवनकाल के लिए अन्य विकल्प भी हैं और आप वास्तव में उस संबंध में सीमित नहीं हैं। प्रायः, वेब ऐप्स बनाम विंडोज ऐप बनाम अन्य एप्लिकेशन प्रकारों के आसपास सर्वोत्तम प्रथाएं हो सकती हैं, लेकिन आपने यह निर्दिष्ट नहीं किया कि आप कौन सी लिख रहे थे।

+0

साथ ऑर्किटेक्चर लेना देना नहीं है दोनों वेब (Silverlight) और खिड़कियां (WPF) – Steve

+0

मैं आदेश में इस को कवर करने के सवाल स्पष्ट किया है का समर्थन किया है। .. – Steve

2

आईएसशन खुले/बंद करने के लिए बहुत सस्ती है। इसे बहुत लंबे समय तक खोलने में समस्या यह है कि कनेक्शन पूल कनेक्शन का पुन: उपयोग नहीं कर सकता है जब तक कि यह समय समाप्त न हो या न हो। यह एक बहुउद्देशीय अनुप्रयोग में एक समस्या हो सकती है।

आपके परिदृश्य में मैं शायद डेटा पुनर्प्राप्त करने के लिए सेवा उन्मुख दृष्टिकोण के लिए जाऊंगा। जिसका मतलब है कि डीटीओ केवल सेवा सीमाओं के भीतर आंतरिक रूप से उपयोग किया जाएगा। यदि आपको ऐसी वस्तुओं की प्रतिलिपि बनाने की आवश्यकता है जो समान दिखते हैं तो मेरा सुझाव है कि आपको AutoMapper पर एक नज़र डालें जो इस विशिष्ट उद्देश्य के लिए बनाया गया था। यदि आपके पास केवल खिड़कियां हैं या केवल वेब प्रोजेक्ट हैं तो यह कोई समस्या नहीं है। जब आप मिश्रण करते हैं। आप वेब ऐप में विंडोज ऐप में सत्रों को उसी तरह से संभाल नहीं सकते हैं।

9

अपने लोडिंग/बचत कोड को अपने डीटीओ से अलग रखें। अंतर्निहित डेटा के डीटीओ ऑब्जेक्ट्स केवल विचार हैं।

अपने प्रश्न पूछते समय, एक परिवर्तन का उपयोग करके डीटीओ वापस कर दें। कुछ ऐसा:

resultSet = session.CreateCriteria(typeof(MyDataObject)) 
    .Add(query criteria, etc.) 
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>()) 
    .List<IMyDTOObject>()
+0

मैं विधि में कौन से मानदंडों का उपयोग कर सकता हूं (डोमेन संपत्ति को डीटीओ संपत्ति से जोड़ने के लिए)? –

+0

@ सिल्वियो डेलगाडो: मुझे खेद है, मैंने एनएचबर्ननेट के साथ 3 वर्षों में काम नहीं किया है, इसलिए मुझे नहीं पता। –

+0

कोई समस्या नहीं है। वैसे भी धन्यवाद। :) –

3

डीटीओ का मतलब "डेटा स्थानांतरण ऑब्जेक्ट" होना है। यही है, गूंगा वस्तुएं आपके सिस्टम में मूल्यों के मूल्यों या संग्रहों को पारित करने के लिए उपयोग की जाती हैं। उन्हें स्वयं को बनाए रखने के लिए ज़िम्मेदार नहीं होना चाहिए, या यहां तक ​​कि अपनी डोमेन परत में डोमेन ऑब्जेक्ट्स को 1-1 से मैप करना चाहिए।

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