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将会去加载链接串指向的数据库,上面已经截过图了。


0 0
原创粉丝点击