第20章 自动生成数据库的同时把必要数据持久化到指定表中

news/2024/11/30 20:38:41/

1 Core.Configuration.CommonConfig

namespace Core.Configuration

{

    /// <summary>

    /// 【常规配置--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的属性成员实例对“appsettings.json”文件中的常规配置相关等数据进行设定性读写操作。

    ///  说明:

    ///     属性成员的名称必须与JSON/值对中的键相同,且属性成员的个数与键的个数也必须相等,

    /// 否则ConfigurationBinder.Bind方法将不支持通过“appsettings.json”文件中数据库连接相关数据与当前类中的属性成员实例的设定性读写操作。

    /// </remarks>

    /// </summary>

    public class CommonConfig : IConfig

    {

        /// <summary>

        /// 【包含Autofac依赖注入容器?】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个值false(默认值:不包含)/true(包含),该值指示是否把第3Autofac依赖注入容器成到当前程序的.NetCore内置依赖注入容器。

        /// </remarks>

        /// </summary>

        public bool UseAutofac { get; set; } = false;

    }

}

2 Services.Installation.IInstallationService

namespace Services.Installation

{

    /// <summary>

    /// 【初始化安装服务--接口】

    /// <remarks>

    /// 摘要:

    ///    继承于该接口的具体实现类在CodeFirst模式下,在执行当前程序的初始化安装时,把当前程序所必要的数据持久化到相应的表中。

    /// </remarks>

    /// </summary>

    public interface IInstallationService

    {

        /// <param name="defaultUserEmail">默认的用户或电子邮箱。</param>

        /// <param name="defaultUserPassword">默认用户或电子邮箱对应的密码。</param>

        /// <summary>

        /// 【异步初始化必要数据】

        /// <remarks>

        /// 摘要:

        ///     在执行当前程序的初始化安装时,把当前程序所必要的数据持久化到相应的表中。

        /// </remarks>

        /// </summary>

        Task InstallRequiredDataAsync(string defaultUserEmail, string defaultUserPassword);

    }

}

3 Services.Installation.InstallationService

using Core.Caching;

using Core.Domain.Customers;

using Data;

namespace Services.Installation

{

    /// <summary>

    /// 【初始化安装服务--类】

    /// <remarks>

    /// 摘要:

    ///    CodeFirst模式下,在执行当前程序的初始化安装时,把当前程序所必要的数据持久化到相应的表中。

    /// </remarks>

    /// </summary>

    public class InstallationService: IInstallationService

    {

        #region 拷贝构造方法与变量

        private readonly IRepository<Customer> _customerRepository;

        private readonly IRepository<Role> _roleRepository;

        private readonly IRepository<CustomerRole> _customerRoleRepository;

        private readonly IStaticCacheManager _staticCacheManager;

        /// <summary>

        /// 【拷贝构建方法】

        /// <remarks>

        /// 摘要:

        ///     依赖注入容器通过拷贝构造方法,实例化该类中的变量成员。

        /// </remarks>

        /// </summary>

        public InstallationService(IRepository<Customer> customerRepository,

            IRepository<Role> roleRepository,

            IRepository<CustomerRole> customerRoleRepository,

            IStaticCacheManager staticCacheManager)

        {

            _customerRepository = customerRepository;

            _roleRepository = roleRepository;

            _customerRoleRepository = customerRoleRepository;

            _staticCacheManager = staticCacheManager;

        }

        #endregion

        #region 方法--私有/保护

        #region 用户和客户初始化安装

        /// <param name="defaultUserEmail">默认的用户或电子邮箱。</param>

        /// <param name="defaultUserPassword">默认用户或电子邮箱对应的密码。</param>

        /// <summary>

        /// 【异步初始化安装用户和客户】

        /// <remarks>

        /// 摘要:

        ///     在执行当前程序的初始化安装时,把必要的角色实例和默认用户实例持久化到角色表、用户表和用户角色映射表中。

        /// </remarks>

        /// </summary>

        protected virtual async Task InstallCustomersAndUsersAsync(string defaultUserEmail, string defaultUserPassword)

        {

            var roleList = new List<Role>

            {

                new Role

                {

                    Name = "Administrators",

                    Active = true,

                    IsSystemRole = true,

                    Remark = "管理员",

                },

                new Role

                {

                    Name = "Registered",

                    Active = true,

                    IsSystemRole = true,

                    Remark = "游客(未注册用户)",

                },

                new Role

                {

                    Name = "ForumModerators",

                    Active = true,

                    IsSystemRole = true,

                    Remark = "论坛主持人",

                },

                new Role

                {

                    Name = "Vendors",

                    Active = true,

                    IsSystemRole = true,

                    Remark = "生产商(1个指定商品的生产商)",

                },

                new Role

                {

                    Name = "Guests",

                    Active = true,

                    IsSystemRole = true,

                    Remark = "游客(未注册用户)",

                },

            };

            await _roleRepository.InsertAsync(roleList);

            var customerList = new List<Customer>

            {

                new Customer

                {

                    Username = "Test",

                    Email = "Test@yourStore.com",

                    Avatar="/images/Avatar/子鼠Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

                new Customer

                {

                    Username = "Test_1",

                    Email = "Test_1@yourStore.com",

                    Avatar="/images/Avatar/丑牛Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

                new Customer

                {

                    Username = "Test_2",

                    Email = "Test_2@yourStore.com",

                    Avatar="/images/Avatar/寅虎Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

                new Customer

                {

                    Username = "Test_3",

                    Email = "Test_3@yourStore.com",

                    Avatar="/images/Avatar/卯兔Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

                new Customer

                {

                    Username = "Test_4",

                    Email = "Test_4@yourStore.com",

                    Avatar="/images/Avatar/辰龙Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

                new Customer

                {

                    Username = "Test_5",

                    Email = "Test_5@yourStore.com",

                    Avatar="/images/Avatar/巳蛇Mecha.png",

                    IsSystemAccount= true,

                    Active = true,

                    Deleted = false,

                    CreatedDate = DateTime.Now,

                },

            };

            await _customerRepository.InsertAsync(customerList);

            List<CustomerRole> customerRoleList = new List<CustomerRole>();

            foreach (var item in customerList)

            {

                if (item.Email.Equals("Test@yourStore.com"))

                {

                    foreach(var role in roleList)

                    {

                        customerRoleList.Add(new CustomerRole { CustomerId =item.Id, RoleId=role.Id });

                    }

                }

                else

                {

                    customerRoleList.Add(new CustomerRole { CustomerId = item.Id, RoleId = roleList.Where(r => r.Name == "Registered").FirstOrDefault().Id });

                }

            }

            await _customerRoleRepository.InsertAsync(customerRoleList);

        }

        #endregion

        #endregion

        #region 方法--接口实现

        /// <param name="defaultUserEmail">默认的用户或电子邮箱。</param>

        /// <param name="defaultUserPassword">默认用户或电子邮箱对应的密码。</param>

        /// <summary>

        /// 【异步初始化必要数据】

        /// <remarks>

        /// 摘要:

        ///     在执行当前程序的初始化安装时,把当前程序所必要的数据持久化到相应的表中。

        /// </remarks>

        /// </summary>

        public virtual async Task InstallRequiredDataAsync(string defaultUserEmail, string defaultUserPassword)

        {

            await InstallCustomersAndUsersAsync(defaultUserEmail, defaultUserPassword);

        }

        #endregion

    }

}

4 Framework.Infrastructure.LazyInstance<T>

using Core.Infrastructure;

namespace Framework.Infrastructure

{

    /// <typeparam name = "T"> 泛型类型实例(1个指定类的类型实例)</typeparam>

    /// <summary>

    /// 【单例--类】

    /// <remarks>

    /// 摘要:

    ///     以泛型形式,对1个指定类的类型实例进行懒加载操作。

    /// </remarks>

    /// </summary>

    public class LazyInstance<T> : Lazy<T> where T : class

    {

        public LazyInstance(): base(() => EngineContext.Current.Resolve<T>())

        {

        }

    }

}

5 重构Framework.Infrastructure.DIStartup.ConfigureServices

//初始化安装服务相关定义实例的依赖注入。

            services.AddScoped<IInstallationService, InstallationService>();

            //Lazy泛型实例,注入到.NetCore内置依赖注入容器中。

            var useAutofac = appSettings.Get<CommonConfig>().UseAutofac;

           if (!useAutofac)

                services.AddScoped(typeof(Lazy<>), typeof(LazyInstance<>));

6 重构Web.Controllers.InstallRefactoringController.DatabaseCreate

 public async Task<IActionResult> DatabaseCreate()

        {

            string _message =string.Empty;

            if (!DataSettingsManager.IsCurrentConnectionString())

            {

                DataSettingsManager.SaveSettings(new DataConfig

                {

                    DataProvider = DataProviderType.SqlServer,

                    ConnectionString = "Data Source=.;Initial Catalog=ShopRazor;Integrated Security=False;Persist Security Info=False;User ID=zz;Password=zz;MultipleActiveResultSets=true;Trust Server Certificate=True"

                }, _fileProvider);

            }

            if (!await DataSettingsManager.CreateDatabaseAsync())

            {

                _message = "未能通过“EntityFrameworkCore”中间件已经在“Microsoft SQL Server”数据库软件中成功生成了指定数据库及其表。";

            }

            else

            {

                //自动生成数据库的同时把必要数据持久化到指定表中,只能使用“EngineContext.Current.Resolve”

                //而不能通过当前类的构造方法来实例化“IInstallationService”实例,因为构造方法不能实例化没有连接字符串的“EFCore”中间件。

                var install = EngineContext.Current.Resolve<Lazy<IInstallationService>>();

                await install.Value.InstallRequiredDataAsync("", "");

                _message = "持久化生成或覆盖数据库连接字符串,并以Code-First方式创建数据库。";

            }

             

            return RedirectToAction("index", new { message = _message });

        }

对以上功能更为具体实现和注释见230601_020ShopRazor(自动生成数据库的同时把必要数据持久化到指定表中)。


http://www.ppmy.cn/news/156660.html

相关文章

short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗?

前者不正确&#xff0c;后者正确。如图所示 对于 short s1 1; s1 s1 1;由于 1 是 int 类型&#xff0c;因此 s11 运算结果也是 int 型&#xff0c; 需要强制转换类型才能赋值给 short 型。 而 short s1 1; s1 1;可以正确编译&#xff0c;因为 s1 1;相当于 s1 (short)(s1 …

小米米家无线洗车机 评测

米家无线洗车机采用无线设计&#xff0c;摆脱电源束缚&#xff0c;方便用户在户外使用。该洗车机采用自吸水式设计&#xff0c;免接水龙头&#xff0c;用户可以用水桶供水。动力方面&#xff0c;米家无线洗车机拥有 2.4MPa 自吸水压&#xff0c;每小时出水量可达 180L。 小米米…

小米9电量夜间待机优化

你是否为夜间小米9手机待机时长严重不足而感到十分不满&#xff1f; 你是否遇到过小米9手机夜间忘记充电仅剩百分之40、50左右的电量&#xff0c;第二天手机没电的情况呢&#xff1f; 是否遇到过不想错过qq、微信等的消息而开着数据、wifi但是夜间损耗大量电量的情况呢&#xf…

小米10s和小米11参数配置对比哪个好 哪个更值得入手

小米11发布了一共5款颜色。分别为三款玻璃&#xff08;AG磨砂工艺&#xff0c;黑、白、蓝&#xff09;、两款素皮&#xff08;烟紫、卡其&#xff09;&#xff0c;共计5款配色。小米11采用了大量精致工艺进一步提升手机质感&#xff0c;相机模组玻璃盖板采用一体式玻璃CNC加工&…

三星手机续航测试软件,三星S21系列续航测试简报出炉

这两天我司火力全开,测试了不少机型的性能、续航等等项目,其中就包括了S21和S21 Ultra,之前三星旗舰系列是每年续航测试重点关注对象。今天就给大家分享一下这两款机型的续航、充电数据。另外,本次数据汇总还新增了vivo X60 Pro的续航,暂时没有充电数据,后续如果测试了会补入表…

联想k80微型计算机用电量,配置高端待机超长 联想K80手机低价上市

联想一款高端超长续航手机低价上市&#xff0c;它就是联系K80&#xff0c;配备了4000毫安大容量电池&#xff0c;通过联想K80评测&#xff0c;该机续航待机时间2天没问题&#xff0c;性能评测中跑分更是近5万&#xff0c;真是一款高端手机&#xff0c;仅1499元的价格超值。 低调…

蓝牙耳机超长续航哪个牌子好?超长待机蓝牙耳机排行榜

随着蓝牙耳机的流行&#xff0c;超长待机的蓝牙耳机越来越成为人们选择的要求。续航久的耳机因为可以减少充电次数而能给人带来超强的体验感&#xff0c;用着就很给力。随着蓝牙无线耳机的品质越来越完备&#xff0c;耳机续航时间也越来越长&#xff0c;下面为大家介绍四款续航…

小米Watch S1 评测

小米Watch S1是一款献给商务人士的高端智能手表&#xff0c;可为工作、差旅、运动健康生活全天候助力。小米Watch S1手表采用蓝宝石镜面玻璃&#xff0c;相对传统玻璃具有更坚固、更通透、更耐磨等特性&#xff0c;戴在手上明亮潇洒&#xff0c;看在眼里质感满满。小米Watch S1…