当前位置: 首页 > news >正文

第3章 配置与服务

1 CoreCms.Net.Configuration.AppSettingsHelper

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Configuration.Json;

namespace CoreCms.Net.Configuration

{

    /// <summary>

    /// 【应用设置助手--类】

    /// <remarks>

    /// 摘要:

    ///     该类中的方法成员,通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。

    /// </remarks>

    /// </summary>

    public class AppSettingsHelper

    {

        #region 拷贝构造方法与变量

        /// <summary>

        /// 【配置】

        /// <remarks>

        /// 摘要:

        ///    .NetCore框架内置配置接口实例(存储着当前程序中所有*.json文件中的数据)。

        /// </remarks>

        /// </summary>

        static IConfiguration Configuration { get; set; }

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法,对.NetCore框架内置配置接口实例(存储着当前程序中所有*.json文件中的数据)。

        /// </remarks>

        /// </summary>

        public AppSettingsHelper(string contentPath)

        {

            string Path = "appsettings.json";

            Configuration = new ConfigurationBuilder().SetBasePath(contentPath).Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true }).Build();

        }

        #endregion

        /// <param name="sections">数组实例,该实例存储着1个指定的根节点及其1指定的子节点。</param>

        /// <summary>

        /// 【获取内容】

        ///  <remarks>

        /// 摘要:

        ///     通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。

        /// </remarks>

        /// <returns>

        /// 返回:

        ///     1指定的子节点所对应的值。

        /// </returns>

        /// </summary>

        public static string GetContent(params string[] sections)

        {

            try

            {

                if (sections.Any())

                {

                    return Configuration[string.Join(":", sections)];

                }

            }

            catch (Exception) { }

            return "";

        }

    }

}

2 CoreCms.Net.Configuration.AppSettingsConstVars

using SqlSugar.Extensions;

namespace CoreCms.Net.Configuration

{

    /// <summary>

    /// 【应用设置格式化--类】

    /// <remarks>

    /// 摘要:

    ///     获取1个指定的根节点中1指定的子节点,获取该子节点所对应的值,最后把该值赋值给该类中的属性成员。

    /// </remarks>

    /// </summary>

    public class AppSettingsConstVars

    {

        #region 全局地址================================================================================

        /// <summary>

        /// 【后端管理地址】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取后端管理地址子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string AppConfigAppUrl = AppSettingsHelper.GetContent("AppConfig", "AppUrl");

        /// <summary>

        /// 【系统接口地址】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取系统接口地址子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string AppConfigAppInterFaceUrl = AppSettingsHelper.GetContent("AppConfig", "AppInterFaceUrl");

        #endregion

        #region 数据库================================================================================

        /// <summary>

        /// 【数据库连接字符串】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取数据库连接字符串子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string DbSqlConnection = AppSettingsHelper.GetContent("ConnectionStrings", "SqlConnection");

        /// <summary>

        /// 【数据库类型】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取数据库类型子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string DbDbType = AppSettingsHelper.GetContent("ConnectionStrings", "DbType");

        #endregion

        #region redis================================================================================

        /// <summary>

        /// redis分布式数据库连接字符串】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取redis分布式数据库连接字符串子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string RedisConfigConnectionString = AppSettingsHelper.GetContent("RedisConfig", "ConnectionString");

        /// <summary>

        /// 【启用redis分布式数据库缓存?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用redis分布式数据库缓存子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool RedisUseCache = AppSettingsHelper.GetContent("RedisConfig", "UseCache").ObjToBool();

        /// <summary>

        /// 【启用redis分布式数据库执行定时任务?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用redis分布式数据库执行定时任务子节点所对应的值。

        /// 说明:

        ///     redis分布式数据库一般也能用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        public static readonly bool RedisUseTimedTask = AppSettingsHelper.GetContent("RedisConfig", "UseTimedTask").ObjToBool();

        #endregion

        #region AOP================================================================================

        /// <summary>

        /// 【启用事务横切?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用事务横切子节点所对应的值。

        /// </remarks>

        public static readonly bool TranAopEnabled = AppSettingsHelper.GetContent("TranAOP", "Enabled").ObjToBool();

        #endregion

        #region Jwt授权配置================================================================================

        /// <summary>

        /// JwtBearer身份认证秘钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认证秘钥子节点所对应的值。

        /// 说明:

        ///     为所有令牌(Token)字符串进行加密操作时,提供数据支撑的秘钥字符串。

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigSecretKey = AppSettingsHelper.GetContent("JwtConfig", "SecretKey");

        /// <summary>

        /// JwtBearer身份认证签发机关】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认证签发机关子节点所对应的值。

        /// 说明:

        ///     用于生成所有令牌(Token)字符串实例,提供数据支撑的签发机关

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigIssuer = AppSettingsHelper.GetContent("JwtConfig", "Issuer");

        /// <summary>

        /// JwtBearer身份认证订阅者】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取JwtBearer身份认订阅者关子节点所对应的值。

        /// 说明:

        ///     用于生成所有令牌(Token)字符串实例,提供数据支撑的订阅者

        /// </remarks>

        /// </summary>

        public static readonly string JwtConfigAudience = AppSettingsHelper.GetContent("JwtConfig", "Audience");

        #endregion

        #region Cors跨域设置================================================================================

        /// <summary>

        /// Cors跨域策略名称】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取Cors跨域策略名称子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string CorsPolicyName = AppSettingsHelper.GetContent("Cors", "PolicyName");

        /// <summary>

        /// 【启用Cors跨域?

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用Cors跨域子节点所对应的值。

        /// 说明:

        ///     是否应用所有的IP,如设置为true,则取消跨域限制。

        /// </remarks>

        /// </summary>

        public static readonly bool CorsEnableAllIPs = AppSettingsHelper.GetContent("Cors", "EnableAllIPs").ObjToBool();

        /// <summary>

        /// Cors跨域IP集】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取Cors跨域IP集子节点所对应的值。

        /// 说明:

        ///     在启用跨域限制时,所允许前端App的域名,注意:IP集中和IIS部署时,最好不要使用8080端口,因为前端App启动时的默认端口一般为:8080,从因前后程序使用同1个端口而造成异常。

        /// </remarks>

        /// </summary>

        public static readonly string CorsIPs = AppSettingsHelper.GetContent("Cors", "IPs");

        #endregion

        #region Middleware中间件================================================================================

        /// <summary>

        /// 【启用Ip限流自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用Ip限流自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareIpLogEnabled = AppSettingsHelper.GetContent("Middleware", "IPLog", "Enabled").ObjToBool();

        /// <summary>

        /// 【启用记录请求与返回数据自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用记录请求与返回数据自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareRequestResponseLogEnabled = AppSettingsHelper.GetContent("Middleware", "RequestResponseLog", "Enabled").ObjToBool();

        /// <summary>

        /// 【启用用户访问记录日志自定义中间件?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用用户访问记录日志自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool MiddlewareRecordAccessLogsEnabled = AppSettingsHelper.GetContent("Middleware", "RecordAccessLogs", "Enabled").ObjToBool();

        /// <summary>

        /// 【用户访问记录-过滤ip自定义中间件】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取用户访问记录-过滤ip自定义中间件子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string MiddlewareRecordAccessLogsIgnoreApis = AppSettingsHelper.GetContent("Middleware", "RecordAccessLogs", "IgnoreApis");

        #endregion

        #region 支付================================================================================

        /// <summary>

        /// 【微信支付回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取微信支付回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackWeChatPayUrl = AppSettingsHelper.GetContent("PayCallBack", "WeChatPayUrl");

        /// <summary>

        /// 【微信退款回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取微信退款回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackWeChatRefundUrl = AppSettingsHelper.GetContent("PayCallBack", "WeChatRefundUrl");

        /// <summary>

        /// 【支付宝支付回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取支付宝支付回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackAlipayUrl = AppSettingsHelper.GetContent("PayCallBack", "AlipayUrl");

        /// <summary>

        /// 【支付宝退款回调】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取支付宝退款回调子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string PayCallBackAlipayRefundUrl = AppSettingsHelper.GetContent("PayCallBack", "AlipayRefundUrl");

        #endregion

        #region 易联云打印机================================================================================

        /// <summary>

        /// 【启用易联云打印机?】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取启用易联云打印机子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly bool YiLianYunConfigEnabled = AppSettingsHelper.GetContent("YiLianYunConfig", "Enabled").ObjToBool();

        /// <summary>

        /// 【易联云打印机ID

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机ID子节点所对应的值。

        /// 说明:

        ///     一般由开发者所申请的易联云打印机服务的编号值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigClientId = AppSettingsHelper.GetContent("YiLianYunConfig", "ClientId");

        /// <summary>

        /// 【易联云打印机密钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机ID子节点所对应的值。

        /// 说明:

        ///     一般由开发者所申请的易联云打印机服务的密钥。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigClientSecret = AppSettingsHelper.GetContent("YiLianYunConfig", "ClientSecret");

        /// <summary>

        /// 【易联云打印机设备号】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机设备号子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigMachineCode = AppSettingsHelper.GetContent("YiLianYunConfig", "MachineCode");

        /// <summary>

        /// 【易联云打印机终端密钥】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机终端密钥子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigMsign = AppSettingsHelper.GetContent("YiLianYunConfig", "Msign");

        /// <summary>

        /// 【易联云打印机名称】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机名称子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigPrinterName = AppSettingsHelper.GetContent("YiLianYunConfig", "PrinterName");

        /// <summary>

        /// 【易联打印机设置联系方式】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取易联云打印机设置联系方式子节点所对应的值。

        /// </remarks>

        /// </summary>

        public static readonly string YiLianYunConfigPhone = AppSettingsHelper.GetContent("YiLianYunConfig", "Phone");

        #endregion

        #region HangFire定时任务================================================================================

        /// <summary>

        /// HangFire登录账号】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取HangFire登录账号子节点所对应的值。

        /// 说明:

        ///     HangFire一般用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        /// </summary>

        public static readonly string HangFireLogin = AppSettingsHelper.GetContent("HangFire", "Login");

        /// <summary>

        /// HangFire登录密码】

        /// <remarks>

        /// 摘要:

        ///     appsettings.json文件中,获取HangFire登录密码子节点所对应的值。

        /// 说明:

        ///     HangFire一般用于自动触发执行当前程序中自定义的计划任务。

        /// </remarks>

        /// </summary>

        public static readonly string HangFirePassWord = AppSettingsHelper.GetContent("HangFire", "PassWord");

        #endregion

    }

}

3 重构CoreCms.Net.Core.Config.SqlSugarSetup

using CoreCms.Net.Configuration;

using Microsoft.Extensions.DependencyInjection;

using SqlSugar;

using SqlSugar.IOC;                  

using System.Reflection;

namespace CoreCms.Net.Core.Config

{

    /// <summary>

    /// SqlSugarCore中间件启动--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员,把SqlSugarCore中间件依赖注入到.Net(Core)框架内置依赖注入容器中。

    /// </remarks>

    /// </summary>

    public static class SqlSugarSetup

    {

        /// <param name="services">.Net(Core)框架内置依赖注入容器实例。</param>

        /// <summary>

        /// 【配置服务】

        /// <remarks>

        /// 摘要:

        ///     通过该方法成员,把SqlSugarCore中间件依赖注入到.Net(Core)框架内置依赖注入容器中。。

        /// </remarks>

        /// </summary>

        public static void AddSqlSugarSetup(this IServiceCollection services)

        {

            if (services == null) throw new ArgumentNullException(nameof(services));

            //注入 ORM

            SugarIocServices.AddSqlSugar(new IocConfig()

            {

                //数据库连接

                ConnectionString = AppSettingsConstVars.DbSqlConnection,

                //判断数据库类型

                DbType = AppSettingsConstVars.DbDbType == IocDbType.MySql.ToString() ? IocDbType.MySql : IocDbType.SqlServer,

                //是否开启自动关闭数据库连接-//不设成true要手动close

                IsAutoCloseConnection = true,

            });

            //设置参数

            services.ConfigurationSugar(db =>

            {

                db.CurrentConnectionConfig.InitKeyType = InitKeyType.Attribute;

                //说明:CoreShop的程序是数据库优先,即必须先生成指定的数据库,本人更为喜欢代码优先所以进行了以下定义来实现代码优先。

                //如果指定的数据库软件中不存在指定的数据库,则自动生成该数据库。

                db.DbMaintenance.CreateDatabase();

                //通过反射操作,获取领域文件夹中的所有实体的类型实例。

                //直接获取指定项目中所有类的类型实例。

                Assembly assembly = Assembly.Load("CoreCms.Net.Model");

                //通过过滤操作,获取领域文件夹中的所有实体的类型实例。

                //注意:“Where”过滤操作中“ c.Namespace”最好使用“Contains”,而不要使用“==”

                Type[] _typeArray = assembly.GetTypes()

                    .Where(c => c.Namespace.Contains("CoreCms.Net.Model.Entities") && c.IsClass)//过滤操作。

                    .ToArray();

                //如果数据库软件对自动生成的数据库支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。

                //注意:SetStringDefaultLength(stringDefaultLength)必须定义在下行语句中,否则在自动生成表时,该约束定义将不会被映射到表的字段上。

                db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(_typeArray);

            });

        }

    }

}

4 CoreCms.Net.Web.Admin\appsettings.json

{

  "ConnectionStrings": {

    "DbType": "SqlServer", //数据库将支持两种模式【SqlServer,MySql

    "SqlConnection": "Server=.;uid=zz;pwd=zz;Database=CoreShop230628;MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;"

    //SqlServer数据库连接字符串,需要开启数据库连接复用【MultipleActiveResultSets=true

    // 如果采用容器化部署Service 要写成mysql的服务名,否则写地址

    //"SqlConnection": "Server=127.0.0.1;Port=3306;Database=CoreShop;Uid=CoreShop;Pwd=CoreShop;CharSet=utf8;pooling=true;SslMode=None;Allow User Variables=true;Convert Zero Datetime=True;Allow Zero Datetime=True;"

    // Mysql数据库链接字符串,请保持后面的属性别少。经过测试,mysql版本需要5.7或以上

  }

}

5 CoreCms.Net.Web.Admin\Program.cs

//把持久化的配置文件“appsettings.json”中的所有数据实例化到“AppSettingsHelper”实例中。

builder.Services.AddSingleton(new AppSettingsHelper(builder.Environment.ContentRootPath));

6 CoreCms.Net.IServices.IBaseServices<T>

7 CoreCms.Net.Services.BaseServices<T>

8 CoreCms.Net.IServices.ISysRoleServices

9 CoreCms.Net.Services.SysRoleServices

10 重构CoreCms.Net.Core.AutoFac.AutofacModuleRegister

using Autofac;

using System.Reflection;

namespace CoreCms.Net.Core.AutoFac

{

    /// <summary>

    /// 【Autofac模型注入--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员把指定的程序集(*.dll)依赖注入到Autofac容器中。

    /// </remarks>

    /// </summary>

    public class AutofacModuleRegister : Autofac.Module

    {

        /// <param name="builder">Autofac依赖注入容器实例。</param>

        /// <summary>

        /// 【载入】

        /// <remarks>

        /// 摘要:

        ///     通过该方法把指定程序集中的所有实例依赖注入到Autofac容器中。

        /// </remarks>

        /// </summary>

        protected override void Load(ContainerBuilder builder)

        {

            //获取当前程序启动项程序集(*.dll)文件所在目录(文件夹)的绝对路径字符串(这里特指“..\bin\Debug\net7.0”)。

            var basePath = AppContext.BaseDirectory;

            #region 带有接口层的服务注入

            var servicesDllFile = Path.Combine(basePath, "CoreCms.Net.Services.dll");

            var repositoryDllFile = Path.Combine(basePath, "CoreCms.Net.Repository.dll");

            if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile)))

            {

                var msg = "Repository.dll和Services.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";

                throw new Exception(msg);

            }

            // 获取 Service.dll 程序集服务,并注册

            var assemblysServices = Assembly.LoadFrom(servicesDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            // 获取 Repository.dll 程序集服务,并注册

            var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            #endregion

        }

    }

}

11 CoreCms.Net.Web.Admin.Controllers.SysRoleController

using Microsoft.AspNetCore.Mvc;

using System.ComponentModel;

using CoreCms.Net.IServices;

namespace CoreCms.Net.Web.Admin.Controllers

{

    [ApiController]

    [Route("[controller]/[action]")]

    public class SysRoleController : ControllerBase

    {

        #region 拷贝构造方法与变量

        private readonly ISysRoleServices _sysRoleServices;

        /// <summary>

        ///     构造函数

        /// </summary>

        public SysRoleController(ISysRoleServices sysRoleServices)

        {

            _sysRoleServices = sysRoleServices;

        }

        #endregion

        #region 获取列表============================================================

        [HttpPost]

        [Description("获取列表")]

        public async Task</*AdminUiCallBack*/ bool> GetPageList()

        {

            //获取数据

            var list = await _sysRoleServices.QueryPageAsync(null, "");

            return true;

        }

        #endregion

    }

}  

 

对以上功能更为具体实现和注释见:230728_003CoreShop230628(配置与服务)。

http://www.lryc.cn/news/99487.html

相关文章:

  • Arcgis之 KML/KMZ文件转shp
  • python绘制3D条形图
  • 计算从曲线的起点到param指定的点的曲线段的长度
  • POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
  • linux----源码安装如何加入到系统服务中(systemclt)
  • Unity 使用UnityWebRequest 读取存档 (IOS只能这样做)
  • Caused by: org.springframework.beans.factory.
  • 【docker 安装】 与【docker-compose 安装】
  • 意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦
  • GAMES101 笔记 Lecture12 Geometry3
  • Java的内部类
  • 电赛培训(高频电路类赛题)学习总结
  • Rust ESP32C3开发
  • 【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
  • Java 中的关键字 final 和 static
  • Spring Cloud OpenFeign 全教程
  • LLaMA模型论文《LLaMA: Open and Efficient Foundation Language Models》阅读笔记
  • 了解Unity编辑器 之组件篇Effects(十一)
  • 笔记整理-SpringBoot中的扩展点
  • 各系统的目录信息路径
  • Asp.Net 使用Log4Net (封装帮助类)
  • 全志F1C200S嵌入式驱动开发(lcd屏幕驱动)
  • dubbo原理框架设计
  • 【数据挖掘】使用 LSTM 进行时间和序列预测
  • Typescript第四章 函数(声明和调用,注解参数类型,多态,类型别名,泛型)
  • 大数据-Spark批处理实用广播Broadcast构建一个全局缓存Cache
  • Android Service的生命周期,两种启动方法,有什么区别
  • 测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)
  • Go语言网络库net/http
  • Acwing.91 最短Hamilton路径(动态规划)