2012-05-19 29 views
6

Tôi đang làm việc với Nop Commerce và tự hỏi liệu có ai đó có thể giúp tôi với sự nhầm lẫn của tôi hay không.Hiểu cách cài đặt Nop Commerce được tải từ cơ sở dữ liệu

Tôi đã gỡ lỗi mã nhiều lần cố gắng tìm hiểu cách cài đặt được tải khi khởi động ứng dụng web. Tôi chỉ không nhận được nó!

Tất cả các lớp cài đặt triển khai giao diện ISettings. Cho phép lấy cài đặt của khách hàng chẳng hạn .. Tôi đã phát hiện ra rằng nó được đại diện bởi lớp CustomerSettings. Trong cơ sở dữ liệu có Setting table. Dữ liệu cho cài đặt khách hàng trông somethng như thế này:

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

Làm thế nào và ở đâu là mỗi người trong số các thiết lập ánh xạ từ customersettings đến lớp CustomerSettings và một tài sản như usernamesenabled ánh xạ tới các UsernamesEnabled tài sản trong lớp CustomerSettings? Và tại sao nó được thực hiện theo cách này?

Tôi biết nó có cái gì để làm với đoạn mã sau vào lớp DependencyRegistrar:

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

Nếu ai đó có thể chỉ cho tôi đi đúng hướng thì nó sẽ được đánh giá cao.

Trả lời

7

Hy vọng tôi không đến trễ.

Có chỉ là một vài điểm có liên quan để xem xét để hiểu làm thế nào cấu trúc đó được tạo ra:

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

Các SettingsService chỉ cung cấp chức năng để lưu trữ và lấy các thiết lập từ các kho, và thực hiện một số chức năng bộ nhớ đệm.

ConfigurationProvider thực hiện phép thuật thực tế.

Hãy xem xét các phương pháp 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 }; 

Sử dụng phản chiếu, lớp * Cài đặt (ví dụ, CustomerSettings), được kiểm tra và tài sản của họ sử dụng để tải các thiết lập tương ứng từ dịch vụ.

Sau đó, nó chuyển đổi trở lại giá trị được lưu trữ như chuỗi (bạn có thể kiểm tra NopCustomTypeConverter để xem cách tuần tự xảy ra) và gán cho họ trở lại Setting Entity:

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

Các phương pháp khác, SaveSettings (thiết lập TSettings) không hoàn toàn ngược lại, có một thực thể Setting và phá vỡ nó xuống, tạo ra cặp khóa-giá trị dưới hình thức ClassName + Propertyvalues)

nó được thực hiện như thế này bởi vì nó triển khai khái niệm từ IoC, segregation of interfaces, n-tier và các mẫu khác để đảm bảo khả năng duy trì (thành phần dựa trên API, ecc testability).

+0

Có cảm ơn tôi đã cố gắng tìm ra điều này. –

Các vấn đề liên quan