2009-06-16 18 views
6

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

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

वर्तमान में मैं यह कर रहा हूं, लेकिन यह "सही" नहीं लगता है। इस विषय पर कोई विचार?

public class LogRun 
{ 
    public virtual int Id { get; private set; } 
    public virtual DateTime StartTime { get; set; } 
    public virtual DateTime EndTime { get; set; } 
    public virtual IList<Log> LogMessages { get; set; } 
    public virtual int LogMessageCount { get { return LogMessages.Count; } } 

    public LogRun() 
    { 
     LogMessages = new List<Log>(); 
    } 


} 

उत्तर

8

लॉग मैसेज एक सतत चीज है? यदि ऐसा है, तो सार्वजनिक सेटर का खुलासा न करने का सबसे अच्छा अभ्यास है।

var myLog = session.Get<LogRun>(1); 
Assert.True(myLog.LogMessages.Count > 0); 
myLog.LogMessages = new List<Log>(); 

आप ध्यान दें, तो NHibernate एक प्रॉक्सी वस्तु लौटा रहा है और एक सामान्य सूची और इसकी जगह यह wonky जब जाने के लिए कारण होगा: यदि आप डेटाबेस से पुनर्प्राप्त और फिर उस IList एक नया एक के साथ बदलें NHibernate अजीब हो जाता है आप कोशिश करते हैं और वापस बचाते हैं।

public class LogRun 
{ 
    private IList<Log> logMessages = new List<Log>(); 

    public virtual int Id { get; private set; } 
    public virtual DateTime StartTime { get; set; } 
    public virtual DateTime EndTime { get; set; } 
    public virtual IList<Log> LogMessages { get { return logMessages; } } 
    public virtual int LogMessageCount { get { return LogMessages.Count; } } 

    public void AddLogMessage(Log log) 
    { 
     logMessages.Add(log); 
    } 
} 

वास्तव में, मैं एक कदम और आगे जाना है, ग्राहक एक IEnumerable < हो जाता है>:

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

मेरे implmentation देखने

public class LogRun 
{ 
    private IList<Log> logMessages = new List<Log>(); 

    public virtual int Id { get; private set; } 
    public virtual DateTime StartTime { get; set; } 
    public virtual DateTime EndTime { get; set; } 
    public virtual IEnumerable<Log> LogMessages { get { return logMessages; } } 
    public virtual int LogMessageCount { get { return LogMessages.Count(); } } 

    public void AddLogMessage(Log log) 
    { 
     logMessages.Add(log); 
    } 
} 
+2

की तरह मैं एक ही पैटर्न का पालन छोड़कर मैं निर्माता में अपने सभी प्रारंभ करना होगा। इसके अतिरिक्त, आमतौर पर एड विधि में माता-पिता के संदर्भ को सेट करना आवश्यक है, यानी logMessages.Add (लॉग) जोड़ें; लॉग.लोग्रुन = यह; –

+2

मैं एक कदम आगे जाता हूं और अपना गेटटर केवल पढ़ने के संस्करण को वापस लौटाता हूं ... लॉग लॉग मैसेज। लिस्ट () .स्राइडऑनली(); – Webjedi

+1

जेमी विचार: सच है, अगर यह माता-पिता के साथ एक है तो वह सहायक इसे स्थापित करने के लिए एक शानदार जगह है। यदि यह कई लोगों के लिए है तो माता-पिता नहीं हैं। यहां संदर्भ पर निश्चित नहीं है लेकिन अत्यधिक संदेह है कि आप सही हैं। वेबजेदी, मुझे भी आपका दृष्टिकोण पसंद है। यही कारण है कि मैं संख्यात्मक पर समाप्त हुआ। मेरे मामले में, यह सब कुछ संतुष्ट है जो मैं संग्रह के साथ करना चाहता था। – Ben

1

मैं एक ही बात करते हैं, लेकिन मैं यह भी आश्चर्य है कि कैसे बड़े कार्यक्षमता प्रभाव, क्योंकि NHibernate भी हर डिफ़ॉल्ट निर्माता कॉल के लिए एक नई सूची <> पैदा करेगा ..

मुझे लगता है कि हम कर रहे हैं भाग्य में हालांकि, और यह काम करेगा। NHibernate की एक आलसी-लोडेड सूची बनाने पर विचार करें LogRun की (जो कारण है कि हम आभासी के रूप में सब कुछ वैसे भी निशान):

  1. NHibernate LogRun से अधिक प्रतिबिंबित और एक व्युत्पन्न वर्ग पैदा करेगा
  2. NHibernate के एक प्रॉक्सी-सूची कर देगा LogRun व्युत्पन्न वर्ग
  3. -
  4. जब आप कि प्रॉक्सी लोड करते हैं, यह उन व्युत्पन्न वर्ग में से कुछ का दृष्टांत होगा, हालांकि, आधार-निर्माता पहले कहा जाता है - तो व्युत्पन्न निर्माता कहा जाता है - नई सूची <> बनाने , इसके बजाय प्रॉक्सी-सूची बनाना।

प्रभावी रूप से, हमने एक ऐसी सूची बनाई है जिसका हम कभी भी उपयोग नहीं करेंगे।

हालांकि विकल्पों पर विचार करें: इतना है कि कोई भी इसे कॉल करेंगे, और एक वैकल्पिक बनाने

  • , निर्माता संरक्षित करें। उदाहरण के लिए, एक स्थिर LogRun.GetNew(); तरीका।
  • आईएलआईस्ट < पर सार्वजनिक सेट-एक्सेस की अनुमति दें> और जब भी आप कोई नई वस्तु बनाते हैं तो इसे स्वयं बनाएं।

सच में, मुझे लगता है कि दोनों बहुत गंदा कर रहे हैं, और के बाद से मैं कर रहा हूँ (सुंदर) सुनिश्चित करें कि प्रत्येक निर्माता-कॉल पर एक नया खाली सूची बनाने की कार्यक्षमता भूमि के ऊपर सीमित है, कि क्या मैं व्यक्तिगत रूप से भी चिपके हुए हूँ अभी तक .. ठीक है, कम से कम मेरे प्रोफाइलर मुझे अन्यथा बताता है: पी

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