NopCommerce 源码研究(四)数据库相关
来源:互联网 发布:视频转gif 知乎 编辑:程序博客网 时间:2024/05/10 19:31
本章来研究数据库
先从Framework的注册看起:
路径:\Presentation\Nop.Web.Framework\DependencyRegistrar.cs l92
//data layer var dataSettingsManager = new DataSettingsManager(); var dataProviderSettings = dataSettingsManager.LoadSettings(); builder.Register(c => dataSettingsManager.LoadSettings()).As<DataSettings>(); builder.Register(x => new EfDataProviderManager(x.Resolve<DataSettings>())).As<BaseDataProviderManager>().InstancePerDependency(); builder.Register(x => x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IDataProvider>().InstancePerDependency(); if (dataProviderSettings != null && dataProviderSettings.IsValid()) { var efDataProviderManager = new EfDataProviderManager(dataSettingsManager.LoadSettings()); var dataProvider = efDataProviderManager.LoadDataProvider(); dataProvider.InitConnectionFactory(); builder.Register<IDbContext>(c => new NopObjectContext(dataProviderSettings.DataConnectionString)).InstancePerLifetimeScope(); } else { builder.Register<IDbContext>(c => new NopObjectContext(dataSettingsManager.LoadSettings().DataConnectionString)).InstancePerLifetimeScope(); }
先调用了DataSettingsManager的LoadSettings方法,我们看下他的代码:
路径:\Libraries\Nop.Core\Data\DataSettingsManager.cs
public partial class DataSettingsManager { protected const char separator = ':'; protected const string filename = "Settings.txt";... /// <summary> /// Load settings /// </summary> /// <param name="filePath">File path; pass null to use default settings file path</param> /// <returns></returns> public virtual DataSettings LoadSettings(string filePath = null) { if (String.IsNullOrEmpty(filePath)) { //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests filePath = Path.Combine(MapPath("~/App_Data/"), filename); } if (File.Exists(filePath)) { string text = File.ReadAllText(filePath); return ParseSettings(text); } return new DataSettings(); }...}
这里加载了\App_Data\Settings.txt的配置文件,我们来看一下这个配置文件
路径:\Presentation\Nop.Web\App_Data\Settings.txt
DataProvider: sqlceDataConnectionString: Data Source=|DataDirectory|\Nop.Db.sdf;Persist Security Info=False
很清晰,这个里面配置DatProvider为sqlce,并配置了链接串。所以LoadSettings返回的DataSettings对象,DataProvider=sqlce,DataConnectionString为上面所列,接下来顺便找到这个数据库文件,对其进行了截图:
路径:\Presentation\Nop.Web\App_Data\Nop.Db.sdf
然后来到了DependencyRegistrar.cs的第四句,这里注册了EfDataProviderManager,我们来看一下代码:
路径:\Libraries\Nop.Data\EfDataProviderManager.cs
public partial class EfDataProviderManager : BaseDataProviderManager { public EfDataProviderManager(DataSettings settings):base(settings) { } public override IDataProvider LoadDataProvider() { var providerName = Settings.DataProvider; if (String.IsNullOrWhiteSpace(providerName)) throw new NopException("Data Settings doesn't contain a providerName"); switch (providerName.ToLowerInvariant()) { case "sqlserver": return new SqlServerDataProvider(); case "sqlce": return new SqlCeDataProvider(); default: throw new NopException(string.Format("Not supported dataprovider name: {0}", providerName)); } } }
第五句注册了IDataProvider,根据配置文件加载的DatProvider为sqlce,所以这里注册的IDataProvider实际类型是SqlCeDataProvider:
后面分别调用了LoadDataProvider()方法和SqlCeDataProvider.InitConnectionFactory()方法,后者代码如下:
路径:\Libraries\Nop.Data\SqlCeDataProvider.cs
public virtual void InitConnectionFactory() { var connectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"); //TODO fix compilation warning (below) #pragma warning disable 0618 Database.DefaultConnectionFactory = connectionFactory; }接下来将NopObjectContext注册为IDbContext类型,NopObjectContext继承了DbContext类,这里就把链接串传到了EF中。
最后注册了EfRepository(泛型注册通过RegisterGeneric() 这个方法实现),而EF将会去加载链接串指向的数据库,上面已经截过图了。
- NopCommerce 源码研究(四)数据库相关
- NopCommerce 源码研究(一)
- NopCommerce 源码研究(二)
- NopCommerce 源码研究(三)
- nopcommerce插件相关
- iOS SDWebImage源码研究(四)
- distcc源码研究四
- NopCommerce数据库操作
- 基于nopCommerce的开发框架(附源码)
- Hbase源码研究(四)------put(2)
- NOPCommerce(1)
- nopCommerce
- NopCommerce架构分析之四----插件机制
- nopcommerce笔记:添加数据表及相关配置
- LIVE555源码研究之四:MediaServer (一)
- LIVE555源码研究之四:MediaServer (一)
- LIVE555源码研究之四:MediaServer (一)
- LIVE555源码研究之四:MediaServer (一)
- android使用webview预览png,pdf,doc,xls,txt,等文件
- 微信小程序 inlin-block 不对齐问题。
- JSP九大内置对象及四个作用域
- <转载>conv_layer和deconv_layer解读
- 西电捷通完整性测试技术与网络安全协议检测系统互操作
- NopCommerce 源码研究(四)数据库相关
- 每个成功的程序员,都会掌握这三种语言!
- 翻译一个图片选择器:ImageSwitcher
- swift 逻辑分支
- Function,Consumer,Predicate 接口
- python特性(四):for语句的工作原理
- HBase phoenix二级索引
- Get Docker for Debian or Raspbian
- 201503-2