2010-12-14 14 views
21

question में आईओसी कंटेनर की उपयोगिता के बारे में करने के लिए, जीतने सबमिटर उल्लेख किया है कि एक आईओसी कंटेनर के साथ आप इस ले जा सकते हैं:क्रूफ़्ट कोड। आईओसी बचाव

public class UglyCustomer : INotifyPropertyChanged 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      string oldValue = _firstName; 
      _firstName = value; 
      if(oldValue != value) 
       OnPropertyChanged("FirstName"); 
     } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      string oldValue = value; 
      _lastName = value; 
      if(oldValue != value) 
       OnPropertyChanged("LastName"); 
     } 
    } 
} 

यह करने के लिए:

var bindingFriendlyInstance = IoC.Resolve<Customer>(new NotifyPropertyChangedWrapper()); 

सवाल:

  • कौन सा जादू आईओसी कंटेनर यह भलाई प्रदान करता है?
  • इसे लागू करने वाला एक उदाहरण?
  • कोई डाउनसाइड्स?
  • जटिल निर्भरताओं वाले एक प्रोजेक्ट में, क्या मैं इन ऑब्जेक्ट्स पर डेटा बाध्यकारी लागू करने का प्रयास करता हूं, तो क्या मैं रो रहा हूं?
+1

मुझे पूरा यकीन है कि उत्तर सिर्फ वास्तविक कार्यान्वयन के बजाय आपको "विचार" के साथ चिढ़ा रहा है। –

+1

@ चतुरता। उस स्थिति में, बेन Scheirman मैंने कभी देखा है कि किसी भी hooker की तुलना में एक बेहतर चिढ़ा है। (निश्चित रूप से एक फिल्म में)। – AngryHacker

+0

यदि आपको किसी ग्राहक के साथ कोई तर्क नहीं है लेकिन शुद्ध डीटीओ और संपत्ति परिवर्तन अधिसूचनाएं हैं तो इसे इंटरफ़ेस, आईसी कस्टमर के रूप में घोषित करना बेहतर होगा, और डायनामिक कोड पीढ़ी के साथ एक ठोस वर्ग बनाने के लिए यह सौदा बड़ा नहीं है। –

उत्तर

9

काम करने के लिए अपने दूसरे कोड स्निपेट के लिए, निश्चित रूप से NotifyPropertyChangedWrapper प्रतिबिंब (या dynamic) का उपयोग करने के लिए एक वर्ग है कि एक अंतरफलक Customer के साथ संगत प्रदान करता है और स्वत: संपत्ति अधिसूचना को लागू करता है उत्पन्न करने के लिए होगा। कोई डेटा बाध्यकारी समस्या नहीं होनी चाहिए, लेकिन थोड़ा ओवरहेड होगा।

एक सरलीकृत कार्यान्वयन एक गतिशील वस्तु का उपयोग करता है कुछ इस तरह दिखाई दे सकता है:

public class NotifyPropertyChangedWrapper<T> 
    : DynamicObject, INotifyPropertyChanged 
{ 
    private T _obj; 

    public NotifyPropertyChangedWrapper(T obj) 
    { 
     _obj = obj; 
    } 

    public override bool TryGetMember(
     GetMemberBinder binder, out object result) 
    { 
     result = typeof(T).GetProperty(binder.Name).GetValue(_obj); 
     return true; 
    } 

    // If you try to set a value of a property that is 
    // not defined in the class, this method is called. 
    public override bool TrySetMember(
     SetMemberBinder binder, object value) 
    { 
     typeof(T).GetProperty(binder.Name).SetValue(_obj, value); 
     OnPropertyChanged(binder.Name); 
     return true; 
    } 

    // Implement OnPropertyChanged... 
} 

जाहिर है, किसी भी कोड है कि इन वस्तुओं में से एक की खपत किसी भी स्थिर प्रकार सुरक्षा खो देगा। दूसरा विकल्प कक्षा को लपेटने के समान इंटरफेस को लागू करने वाली कक्षा उत्पन्न करना है। वेब पर इसके लिए बहुत सारे उदाहरण हैं। मुख्य आवश्यकता यह है कि आपके Customer को या तो interface होना चाहिए या इसके सभी गुणों को वर्चुअल होने की आवश्यकता होगी।

+0

हां, यदि आपको किसी ग्राहक के साथ कोई तर्क नहीं है लेकिन शुद्ध डीटीओ और रोपर्टी परिवर्तन अधिसूचनाएं हैं तो इसे इंटरफ़ेस, आईसी कस्टमर के रूप में घोषित करना बेहतर होगा, और फिर ऐसा निर्माण एक ठोस वर्ग बनाने के लिए एक सौदा नहीं है गतिशील कोड पीढ़ी। –

+0

वैसे भी DynamicObject के बिना ऐसा करने के लिए? मैं .NET 3.5 पर हूं। और इंटेलिजेंस नहीं छोड़ना। – AngryHacker

+0

आपको पॉली ने जो करना है उसे करना होगा। मैंने पहले यह किया है, लेकिन कोड लंबा है, और मेरे पास यह उपलब्ध नहीं है। यहां एक लेख दिया गया है जहां कोई और ऐसा करता है: http://grahammurray.wordpress.com/2010/04/13/ गतिशील रूप से- जनरेटिंग-types-to-implement-inotifypropertychanged/ – Jacob

2

मैंने कभी इसका उपयोग नहीं किया है, लेकिन आप माना जाता है कि PostSharp का उपयोग करके ऐसा कुछ बना सकते हैं।

3

इसे सामान्य तरीके से करने के लिए (यानी किसी भी वर्ग के लिए INOTifyPropertyChanged लागू करने वाले कोड का एक टुकड़ा) प्रॉक्सी का उपयोग करें। Castle.DynamicProxy या LinFu या Unity के साथ ऐसा करने के लिए बहुत सारे कार्यान्वयन हैं। इन प्रॉक्सी पुस्तकालयों में आईओसी कंटेनर में अच्छा समर्थन है, उदाहरण के लिए डायनामिकप्रॉक्सी का कैसल विंडसर और यूनिटी इंटरसेप्शन (या जिसे भी कहा जाता है) के साथ अच्छा एकीकरण है, एकता कंटेनर के साथ स्पष्ट रूप से अच्छा एकीकरण है।

1

यदि आप स्वतः उत्पन्न करने वाली बाध्यकारी वस्तुओं के लिए एक विशिष्ट समाधान की तलाश में हैं तो आपको PropertyChanged.Fody (पहले NotifyPropertyWeaver) देखना चाहिए। यह अधिसूचना कोड को शामिल करने के लिए शामिल IotifyProperty को लागू करने वाले वर्गों को फिर से लिखता है। जिथब पेज पर एक उदाहरण है।

मेरी राय में प्रस्तावित आईओसी कंटेनर समाधान का उपयोग करने से यह साफ है। हालांकि, यह एक पुस्तकालय विशिष्ट है जो INotifyPropertyChanged बाध्यकारी है, इसलिए एक सामान्य समाधान के रूप में लागू नहीं है, जैसा कि आपके लिंक किए गए प्रश्न में चर्चा की जा रही थी।

+0

सवाल विशेष रूप से पूछ रहा था कि कौन सा *** आईओसी कंटेनर *** है जो उस सुविधा प्रदान करता है। दो साल के पुराने प्रश्न को खोलें *** जिसका जवाब एक स्वीकार्य उत्तर ** है जिसके उत्तर में वास्तव में प्रश्न का समाधान नहीं होता है। – jgauffin

+0

मैंने इस सवाल को कोड क्रुफ्ट को कम करने के लिए व्याख्या की, मैं उस परिप्रेक्ष्य से जवाब दे रहा था। मुझे लगता है कि आईओसी फोकस मुख्य रूप से इसलिए है क्योंकि यह किसी अन्य आईओसी प्रश्न से प्रेरित था। यहां तक ​​कि यदि मेरा जवाब आईओसी का उपयोग नहीं करता है, तो मुझे लगता है कि यह इंगित करने के लिए मूल्यवान है कि अन्य तकनीक वांछित परिणाम प्राप्त करने के लिए बेहतर हो सकती हैं। इसके अलावा, [मेटा पर यह प्रश्न] (http://meta.stackexchange.com/questions/20524/reviving-old-questions) निष्कर्ष निकाला है कि पुराने प्रश्नों का उत्तर ठीक है। –

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