2012-05-19 13 views
6

से नोप कॉमर्स सेटिंग्स को कैसे लोड किया जाता है यह समझना मैं Nop Commerce के साथ काम कर रहा हूं और सोच रहा हूं कि कोई मेरी भ्रम के साथ मेरी मदद कर सकता है या नहीं।डेटाबेस

मैंने वेब एप्लिकेशन की शुरूआत में सेटिंग्स को लोड करने के तरीके को जानने के लिए कई बार कोड डीबग किया है। मुझे यह बिलकुल समझ में नहीं आया!

सभी सेटिंग्स वर्ग ISettings इंटरफ़ेस को लागू करते हैं। चलिए उदाहरण के लिए ग्राहक सेटिंग्स लेते हैं .. मुझे पता चला है कि यह CustomerSettings वर्ग द्वारा दर्शाया गया है। डेटाबेस में Setting table है। ग्राहक सेटिंग के लिए डेटा इस तरह somethng दिखता है:

customersettings.usernamesenabled 
customersettings.checkusernameavailabilityenabled 
customersettings.allowuserstochangeusernames 
... and so on... 

कैसे और कहाँ इन सेटिंग्स customersettings से CustomerSettings वर्ग और usernamesenabled की तरह एक संपत्ति CustomerSettings कक्षा में UsernamesEnabled संपत्ति को मैप किया को मैप किया में से प्रत्येक के कर रहे हैं? और यह इस तरह क्यों लागू किया गया था?

मैं जानता हूँ कि यह DependencyRegistrar वर्ग में निम्न कोड के साथ कुछ है:

builder.RegisterGeneric(typeof(ConfigurationProvider<>)).As(typeof(IConfigurationProvider<>)); 
builder.RegisterSource(new SettingsSource()); 

कोई सही दिशा में मुझे इंगित कर सकते हैं तो यह सराहना की जाएगी।

उत्तर

7

आशा है कि मुझे देर हो चुकी है।

वहाँ केवल कुछ ही प्रासंगिक अंक को देखने के लिए समझने के लिए कैसे है कि संरचना बनाई गई है कर रहे हैं:

-Nop.Services.Configuration.ConfigurationProvider class 
-Nop.Services.Configuration.ISettingsService interface 
-Nop.Services.Configuration.SettingsService class 

SettingsService केवल खजाने से स्टोर और सेटिंग प्राप्त करने हेतु सुविधा प्रदान करता है, और कुछ कैशिंग कार्यक्षमता लागू करता है।

कॉन्फ़िगरेशनप्रोवाइडर वास्तविक जादू करता है।

चलो BuildConfiguration विधि को देखो:

 // get properties we can write to 
     var properties = from prop in typeof(TSettings).GetProperties() 
         where prop.CanWrite && prop.CanRead 
         let setting = _settingService.GetSettingByKey<string>(typeof(TSettings).Name + "." + prop.Name) 
         where setting != null 
         where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).CanConvertFrom(typeof(string)) 
         where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).IsValid(setting) 
         let value = CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).ConvertFromInvariantString(setting) 
         select new { prop, value }; 

प्रतिबिंब का उपयोग करना, * सेटिंग्स वर्ग (उदाहरण के लिए, CustomerSettings), निरीक्षण कर रहे हैं और उनके गुणों सेवा से इसी सेटिंग लोड करने में इस्तेमाल किया।

तो यह स्ट्रिंग के रूप में संग्रहीत मूल्य वापस धर्मान्तरित (आप देखना चाहते हैं कि क्रमबद्धता होता NopCustomTypeConverter जांच कर सकते हैं) और सेटिंग इकाई के लिए उन्हें वापस आवंटित: (

properties.ToList().ForEach(p => p.prop.SetValue(Settings, p.value, null));

अन्य विधि, SaveSettings TSettings सेटिंग) ठीक विपरीत होता है, एक की स्थापना इकाई लेता है और यह टूट जाती है, className + Propertyvalues ​​की फार्म)

यह इस तरह लागू किया गया था, क्योंकि यह IoC, segregation of interfaces से अवधारणाओं तैनात में कुंजी और मान के जोड़े पैदा करने, n-tier और अन्य पैटर्न बनाए रखने योग्यता सुनिश्चित करने के लिए (एपीआई आधारित घटककरण, टेस्टेबिलिटी ईसीसी)।

+0

हाँ धन्यवाद, मैं इसे समझने में कामयाब रहा। –