सकत क्या NHibernate इकाई के निर्माता से आभासी गुणों को कॉल करना ठीक है?




वीडियो कॉल करना है (5)

इस उदाहरण कोड पर एक नज़र डालें:

public class Comment
{
    private Comment()
    { }

    public Comment(string text, DateTime creationDate, string authorEmail)
    {
        Text = text;
        CreationDate = creationDate;
        AuthorEmail = authorEmail;
    }

    public virtual string Text { get; private set; }
    public virtual DateTime CreationDate { get; set; }
    public virtual string AuthorEmail { get; private set; }
}

मुझे पता है कि यह कंसल्टेंट से आभासी सदस्य कार्यों को कॉल करने के लिए खराब अभ्यास माना जाता है, हालांकि, NHibernate में मुझे आलसी लोडिंग का समर्थन करने के लिए वर्चुअल होने के लिए गुणों की आवश्यकता है। क्या इस मामले में ठीक माना जाता है?


मुझे पता है कि FxCop शिकायत करता है अगर आप अपने कन्स्ट्रक्टर में एक आभासी विधि कहते हैं, लेकिन मुझे नहीं पता कि FxCop क्या कहता है कि आप अपने कन्स्ट्रक्टर में एक वर्चुअल प्रॉपर्टी कह रहे हैं ...
मुझे लगता होगा कि एफएक्सकॉप शिकायत करेगा क्योंकि आईएल में एक संपत्ति के लिए संपत्ति का अनुवाद किया गया है।

आप अपने गुणों को 'गैर-आभासी' के रूप में भी बना सकते हैं, और एनएचआईएननेट में 'क्लास मैपिंग' पर बस 'आलसी = झूठी' को निर्दिष्ट करें। यह संग्रह के आलसी-लोड व्यवहार को प्रभावित नहीं करेगा।

(मैं हर समय ऐसा करता हूं, क्योंकि मुझे यह पसंद नहीं है कि मेरा बुनियादी ढांचे (NHibernate) के लिए मुझे गुण आभासी होना चाहिए
मैं यह भी नहीं जानता कि क्या NHibernate में गतिशील प्रॉक्सी के प्रदर्शन के लाभ महत्वपूर्ण हैं)।


इस नमूने में ठीक है, लेकिन जब आप कक्षा को प्राप्त करते हैं और गुणों को ओवरराइड करते हैं तो यह समस्याएं पैदा कर सकता है आम तौर पर, आप आभासी गुणों के लिए फ़ील्ड को बेहतर बना सकते हैं।


मुझे पूरा यकीन है कि यह ठीक है, लेकिन अगर आप चिंतित हैं कि आप पैरामीटर कम कन्स्ट्रक्टर कॉल के बाद गुणों को हमेशा निर्दिष्ट कर सकते हैं।


पको के जवाब पर विस्तार करने के लिए:

ज्यादातर मामलों में यह चोट नहीं करता है। लेकिन अगर कक्षा विरासत में मिली है, वर्चुअल गुणों को ओवरराइड करने के लिए / सेट करने की अनुमति देता है, इसलिए व्यवहार अब पूरी तरह से समझाया और नियंत्रित नहीं है, इसलिए सिद्धांत रूप में इसे तोड़ सकता है। FxCop इस बारे में चेतावनी देता है क्योंकि यह एक संभावित समस्या है

FxCop का मुद्दा हालांकि आपको संभावित समस्याओं के बारे में चेतावनी देने में मदद करना है यदि आपको पता है कि कभी भी कक्षा से उत्तीर्ण होने वाला है, लेकिन यह आधिकारिक तौर पर 'सर्वश्रेष्ठ अभ्यास' नहीं है, तो कंसक्टर के गुणों का उपयोग करना गलत नहीं है

तो, इसका उत्तर यह है कि जब तक आप कक्षा के किसी भी वारिस को नियंत्रित करते हैं, तब तक यह ठीक है। अन्यथा, इसका उपयोग न करें और फील्ड मान सीधे सेट करें। (जिसका अर्थ है कि आप सी # 3.0 स्वचालित मिल / सेट प्रॉपर्टी का उपयोग नहीं कर सकते हैं - आपको खुद को फ़ील्ड लपेटने वाले गुणों को लिखना होगा।)

साइड नोट: व्यक्तिगत रूप से, मेरे सभी प्रोजेक्ट वेब साइट हैं जो हम ग्राहकों के लिए होस्ट करते हैं। इसलिए यह सोचते हुए कि यह सेटअप एक परियोजना के लिए एक ही रहता है, इसकी तुलना में विभिन्न निरर्थक / तर्क जाँच डुप्लिकेट करने के लिए व्यापार बंद होने की अपेक्षा है। लेकिन, किसी भी अन्य मामले में जहां मुझे यकीन नहीं है कि हम परियोजना का पूर्ण नियंत्रण और वर्ग के उपयोग को बनाए रखेंगे, मैं इस शॉर्टकट को नहीं लेगा


सबसे अच्छा अभ्यास आईएमएचओ समर्थन क्षेत्र के साथ गुणों का उपयोग करना है:

public class Comment
{
    private DateTime _creationDate;
    private string _text;
    private string _authorEmail;
    private Comment() { }
    public Comment(string text, DateTime creationDate, string authorEmail)
    {
        _text = text;
        _creationDate = creationDate;
        _authorEmail = authorEmail;
    }
    public virtual string Text
    {
        get { return _text; }
        private set { _text = value; }
    }
    public virtual string AuthorEmail
    {
        get { return _authorEmail; }
        private set { _authorEmail = value; }
    }
    public virtual DateTime CreationDate
    {
        get { return _creationDate; }
        set { _creationDate = value; }
    }
}

तो आप बाल वर्गों पर समस्याओं से बच सकते हैं और अब आपको कोई चेतावनी नहीं दिखाई दे रही है