ASP.NET Core - 配置系统之自定义配置提供程序
ASP.NET Core - 配置系统之自定义配置提供程序
- 4. 自定义配置提供程序
- IConfigurationSource
- IConfigurationProvider
4. 自定义配置提供程序
在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现,这两个接口在上一章 ASP.NET Core - 配置系统之配置提供程序 中也有提到了。
IConfigurationSource
IConfigurationSource 负责创建 IConfigurationProvider 实现的实例。它的定义很简单,就一个Build方法,返回 IConfigurationProvider 实例:
public interface IConfigurationSource
{IConfigurationProvider Build(IConfigurationBuilder builder);
}
IConfigurationProvider
IConfigurationProvider 负责实现配置的设置、读取、重载等功能,并以键值对形式提供配置。
public interface IConfigurationProvider
{// 获取指定父路径下的直接子节点Key,然后 Concat(earlierKeys) 一同返回IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);// 当该配置提供程序支持更改追踪(change tracking)时,会返回 change token// 否则,返回 nullIChangeToken GetReloadToken();// 加载配置void Load();// 设置 key:valuevoid Set(string key, string value);// 尝试获取指定 key 的 valuebool TryGet(string key, out string value);
}
像工作中常用的配置中心客户端,例如 nacos、consul,都是实现了对应的配置提供程序,从而将配置中心中的配置无缝地接入到 .NET Core 的配置系统中进行使用,和本地配置文件的使用没有分别。
如果我们需要封装自己的配置提供程序,推荐直接继承抽象类 ConfigurationProvider,该类实现了 IConfigurationProvider 接口,继承自该类只要实现 Load 方法即可,Load 方法用于从配置来源加载解析配置信息,将最终的键值对配置信息存储到 Data 中。这个过程中可参考一下其他已有的配置提供程序的源码,模仿着去写自己的东西。
在我们日常的系统平台中,总少不了数据字典这样一个功能,用于维护平台中一些业务配置,因为是随业务动态扩展和变动的,很多时候不会写在配置文件,而是维护在数据库中。以下以这样一个场景实现一个配置提供程序。
因为是以数据库作为载体来存储配置信息,所以第一步就是定义实体类
public class DataDictioaryDO
{public int Id { get; set; }public int? ParentId { get; set; }public string Key { get; set; }public string Value { get; set; }
}
数据字典支持多级级联,通过 ParentId 关联上一级,ParentId 为空的即为根节点,如存在下级节点则 Value 值可以为空,就算填写了也无效,最终呈现出来的就是一个树结构。
然后就是定义相应的数据库访问上下文 DataDictionaryDbContext
public class DataDictionaryDbContext : DbContext
{public DbSet<DataDictioaryDO> DataDictioaries { get; set; }public DataDictionaryDbContext(DbContextOptions<DataDictionaryDbContext> options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.Entity<DataDictioaryDO>().HasKey(e => e.Id);modelBuilder.Entity<DataDictioaryDO>().Property(e => e.Value).IsRequired(false);}
}
通过 DbContextOptions 交由外部去配置具体的数据库类型和连接字符串。
之后创建 IConfigurationSource 实现类,主要就是构造函数中需要传入数据库配置委托,并且在 Build 实例化EFDataDictionaryConfigurationProvider 对象。
public class EFDataDictionaryConfigurationSource : IConfigurationSource
{private readonly Action<DbContextOptionsBuilder> _action;public EFDataDictionaryConfigurationSource(Action<DbContextOptionsBuilder> action){_action= action;}public IConfigurationProvider Build(IConfigurationBuilder builder){return new EFDataDictionaryConfigurationProvider(_action);}
}
之后通过继承 ConfigurationProvider 实现 EFDataDictionaryConfigurationProvider,主要逻辑就是从数据库获取对应的数据表,如果表中没有数据则插入默认数据,再通过相应的解析器解析数据表数据生成一个 Dictionary<string, string>
对象。
public class EFDataDictionaryConfigurationProvider : ConfigurationProvider
{Action<DbContextOptionsBuilder> OptionsAction { get; }public EFDataDictionaryConfigurationProvider(Action<DbContextOptionsBuilder> action){OptionsAction = action;}public override void Load(){var builder = new DbContextOptionsBuilder<DataDictionaryDbContext>();OptionsAction(builder);using var dbContext = new DataDictionaryDbContext(builder.Options);if(dbContext == null){throw new Exception("Null DB Context !");}dbContext.Database.EnsureCreated();if (!dbContext.DataDictioaries.Any()){CreateAndSaveDefaultValues(dbContext);}Data = EFDataDictionaryParser.Parse(dbContext.DataDictioaries);}private void CreateAndSaveDefaultValues(DataDictionaryDbContext context){var datas = new List<DataDictioaryDO>{new DataDictioaryDO{Id = 1,Key = "Settings",},new DataDictioaryDO{Id = 2,ParentId = 1,Key = "Provider",Value = nameof(EFDataDictionaryConfigurationProvider)},new DataDictioaryDO{ Id = 3,ParentId = 1,Key = "Version",Value = "v1.0.0"}};context.DataDictioaries.AddRange(datas);context.SaveChanges();}
}
其中,解析器 EFDataDictionaryParser
的代码如下,主要就是通过递归的方式,通过树形数据的 key 构建完整的 key,并将其存入 Dictionary<string,string>
对象中。
internal class EFDataDictionaryParser
{private readonly IDictionary<string, string> _data = new SortedDictionary<string, string>(StringComparer.OrdinalIgnoreCase);private readonly Stack<string> _context = new();private string _currentPath;private EFDataDictionaryParser() { }public static IDictionary<string, string> Parse(IEnumerable<DataDictioaryDO> datas) =>new EFDataDictionaryParser().ParseDataDictionaryConfiguration(datas);private IDictionary<string, string> ParseDataDictionaryConfiguration(IEnumerable<DataDictioaryDO> datas){_data.Clear();if(datas?.Any() != true){return _data;}var roots = datas.Where(d => !d.ParentId.HasValue);foreach (var root in roots){EnterContext(root.Key);VisitElement(datas, root);ExitContext();}return _data;}private void VisitElement(IEnumerable<DataDictioaryDO> datas, DataDictioaryDO parent){var children = datas.Where(d => d.ParentId == parent.Id);if (children.Any()){foreach (var section in children){EnterContext(section.Key);VisitElement(datas, section);ExitContext();}}else{var key = _currentPath;if (_data.ContainsKey(key))throw new FormatException($"A duplicate key '{key}' was found.");_data[key] = parent.Value;}}private void EnterContext(string context){_context.Push(context);_currentPath = ConfigurationPath.Combine(_context.Reverse());}private void ExitContext(){_context.Pop();_currentPath = ConfigurationPath.Combine(_context.Reverse());}
}
之后为这个配置提供程序提供一个扩展方法,方便之后的使用,如下:
public static class EFDataDictionaryConfigurationExtensions
{public static IConfigurationBuilder AddEFDataDictionaryConfiguration(this IConfigurationBuilder builder, Action<DbContextOptionsBuilder> optionAction){builder.Add(new EFDataDictionaryConfigurationSource(optionAction));return builder;}
}
之后在入口文件中将我们的配置扩展程序添加到配置系统中,并指定使用内存数据库进行测试
using ConfigurationSampleConsole.ConfigProvider;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;using var host = Host.CreateDefaultBuilder(args).ConfigureAppConfiguration((context, config) =>{// 清除原有的配置提供程序config.Sources.Clear();config.AddEFDataDictionaryConfiguration(builder =>{builder.UseInMemoryDatabase("DataDictionary");});}).Build();var configuration = host.Services.GetService<IConfiguration>();Console.WriteLine($"Settings:Provider: {configuration.GetValue<string>("Settings:Provider")}");
Console.WriteLine($"Settings:Version: {configuration.GetValue<string>("Settings:version")}");host.Run();
最后的控制台输出结果如下:
以上就是 .NET Core 框架下配置系统的一部分知识点,更加详尽的介绍大家可以再看看官方文档。配置系统很多时候是结合选项系统一起使用的,下一篇将介绍一下 .NET Core 框架下的选项系统。
参考文章:
ASP.NET Core 中的配置 | Microsoft Learn
配置 - .NET | Microsoft Learn
理解ASP.NET Core - 配置(Configuration)
ASP.NET Core 系列总结:
目录:ASP.NET Core 系列总结
上一篇:ASP.NET Core — 配置系统之配置提供程序
下一篇:ASP.NET Core — 选项系统之选项配置
相关文章:
ASP.NET Core - 配置系统之自定义配置提供程序
ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...
大语言模型的稀疏性:提升效率与性能的新方向
大语言模型的稀疏性:提升效率与性能的新方向 大语言模型(LLM, Large Language Model)随着参数规模的不断扩大,其性能得到了显著提升,但也带来了巨大的计算和存储开销。稀疏性(Sparsity)作为一种…...
迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件
bundle.json 文件内容如下所示: 下面是对各个字段的解释: 1. name: "ohos/demos" - 这是组件或项目的名称,这里表示它属于 OHOS(OpenHarmony OS)生态系统下的一个名为"demos"的组件。 2. descri…...
vulnhub靶场【IA系列】之Tornado
前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…...
GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求
背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X(车与外界通信)的部分,主要关注于通信安全要求,旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层(数据无异常)、应用…...
基于mediapipe的手势游戏控制
基于mediapipe的手势游戏控制 玩游戏,那不是有手就行!!! mediapipe介绍 Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。…...
K8S 节点选择器
今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...
IEC103 转 ModbusTCP 网关
一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 ,是三格电子推出的工业级网关(以下简 称网关),主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集, IEC103 支持遥测和遥 信,可接…...
docker swarm 部署问题 和 指定节点部署服务
问题原因: docker swarm 部署遇到的问题, 先前docker compose部署,分别创建了 cloud 网络; 昨进行swarm 集群部署;只是删了57 机器cloud 网络;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…...
09.VSCODE:安装 Git for Windows
在 Windows 下安装著名的源代码管理工具:git。 git 工具两大作用: 管理我们自己的源代码获取他人(开源的)源代码 当前我们更需要第2点。 为什么要安装 git 一、 得到更多库 之前课程中我们安装了 msys2,从而可以通…...
基于R计算皮尔逊相关系数
# 基于R计算皮尔逊相关系数 # 函数 基本基本函数 cor.test ## 两组数据读入 xread.csv("1.csv",header T) yread.csv("2.csv",header T) ## 计算 cor.test(1,2,method"pearson") 结果 Pearsons product-moment correlationdata: 1 and 2…...
vue 纯前端导出 Excel
方法一: 1、安装"file-saver" npm i -S file-saver xlsx 2、引入 在需要导出功能的 .vue 文件中引入 import FileSaver from "file-saver"; import XLSX from "xlsx"; 3、简单示例(复制即可食用)&#x…...
APISQL在线一键安装教程
本文档将指导您在 Linux 服务器上使用 Docker 安装 APISQL 软件。提供了两种安装方式:在线安装和离线安装,您可以根据实际环境选择合适的安装方式。 1. 准备工作 1.1 硬件要求 Linux (x86_64) 服务器 1.2 软件要求 Docker Engine 推荐版本ÿ…...
数据结构《MapSet哈希表》
文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...
【PCL】sample_consensus 模块—— Random Sample Consensus model(随机样本一致性模型,RANSAC)
1、随机样本一致性模型(RANSAC)简介 在本教程中,我们将学习如何使用带有平面模型的随机样本一致性(RANSAC)来获取适合该模型的点云。 1.1理论背景 RANSAC 是“随机样本一致性”(RANdom SAmple Consensus…...
【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码
该代码实现了一维无迹卡尔曼滤波器(UKF)与交互式多模型(IMM)结合的状态估计。代码分为多个部分,主要功能包括参数定义、观测数据生成、状态估计、模型更新以及结果可视化。 文章目录 运行结果程序代码主要功能代码结构应用场景注意事项运行结果 程序代码 下方源代码直接粘…...
docker-compose部署kafka 3.3.1 kraft
一、服务器: 节点1:10.1.1.165 节点2:10.1.1.164 节点3:10.1.1.169二、添加环境地址解析 vim /etc/hosts kafka1 10.1.1.165 kafka2 10.1.1.164 kafka3 10.1.1.169三、节点配置 节点1 version: "3" services:kafka1:image: bitnami/kafka:3.3.1contain…...
Linux 串口检查状态的实用方法
在 Linux 系统中,串口通信是非常常见的操作,尤其在嵌入式系统、工业设备以及其他需要串行通信的场景中。为了确保串口设备的正常工作,检查串口的连接状态和配置信息是非常重要的。本篇文章将介绍如何在 Linux 上检查串口的连接状态࿰…...
使用FRP进行内网穿透
一、基本概念 内网穿透:它是一种网络技术或方法,旨在允许外部网络(如互联网)访问位于内部网络(内网)中的设备或服务。由于内部网络通常处于NAT(网络地址转换)、防火墙或其他安全机制…...
Ubuntu打开文件夹不显示文件
1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容,而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus...
HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)
在HarmonyOS NEXT开发环境中,可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库,从零开始实现一个简单的影视APP,主要关注影视搜索页的功能实现。 为什么选择nutpi/axios? nutpi…...
探秘 JMeter 前置处理器:让性能测试如虎添翼
想象一下,你是一位超级英雄,要对一个庞大的虚拟城市(Web 应用)进行全面的 “健康检查”。JMeter 就是你的神奇工具包,而其中的前置处理器,就像是这个工具包里的各种超级武器,能帮助你轻松应对各…...
如何在gitlab cicd中实现每月10号上午执行
在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…...
深度学习基础知识
深度学习是人工智能(AI)和机器学习(ML)领域的一个重要分支,以下是对深度学习基础知识的归纳: 一、定义与原理 定义:深度学习是一种使计算机能够从经验中学习并以概念层次结构的方式理解世界的机…...
面试加分项:Android Framework AMS 全面概述和知识要点
第一章:AMS 的架构与组件 1.1 AMS 整体架构 在 Android 系统的庞大体系中,AMS(Activity Manager Service)就如同一个中枢神经系统,是整个系统的核心服务之一,对应用的性能和用户体验有着直接且关键的影响 。它的整体架构由 Client 端和 Service 端两大部分组成,这两端相…...
网安——CSS
一、CSS基础概念 CSS有两个重要的概念,分为样式和布局 CSS的样式分为两种,一种是文字的样式,一种是盒模型的样式 CSS的另一个重要的特质就是辅助页面布局,完成HTML不能完成的功能,比如并排显示或精确定位显示 从HT…...
知识图谱常见的主流图数据库
在知识图谱中,主流使用的图数据库包括以下几种: Neo4j:这是目前全球部署最广泛的图数据库之一,具有强大的查询性能和灵活的数据模型,适用于复杂关系数据的存储和查询。 JanusGraph:JanusGraph是一个开源的…...
阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能
在城市的脉络中,地下管网犹如隐秘的动脉,支撑着现代生活的运转。而在这庞大网络的关键节点上,阀井扮演着不可或缺的角色。然而,由于其密闭性和复杂性,阀井内部一旦发生可燃气体泄漏,将对公共安全构成严重威…...
【6】Word:海名公司文秘❗
目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换:粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列,单机右键…...
微信原生小程序自定义封装组件(以导航navbar为例)
封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…...
<OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加
更新日志: Created on 14Jan.2025 by Dave , added openssh-server, tailescape Updated on 15Jan.2025, added "tailescape - tailscape ssh" 前期准备: 1. 更新可用软件包的数据库 2. 升级系统中所有已安装的软件包到最新版本 3. 安装 cur…...
HQL(JPQL)和原生SQL实现查询自定义返回类
维修申请实例RepairApplyInstance: package com.byx.scaffold.common.entity.jpa;import com.byx.scaffold.common.entity.jpaEnum.RepairStatusConstant; import lombok.Data;import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence…...
微信小程序 实现拼图功能
微信小程序 实现拼图 效果示例功能描述代码示例 效果示例 微信小程序 碎片拼图 功能描述 在微信小程序中,实现一个简单的拼图小游戏。用户需要将四张碎片图片拖动到目标图片的正确位置,具体功能如下: 拖动功能: 用户可以通过手指…...
《C++11》并发库:简介与应用
在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …...
【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍
从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access,也就是Remote的DMA,是一种硬件机制,能直接访问远端结点的内存,而不需要处理器介入。 其中: Remote:跨node进行数据传输Directÿ…...
Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件
通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码,将远程的6006端口代理到本地 在服务器终端,激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…...
【Linux】常见指令(一)
Linux常见指令 01.whoami02.pwd03.ls04.mkdir05.cd 本文LInux环境为,使用XShell远程登陆到Linux。 具体如何环境搭建,大家可以查看其他博客。 01.whoami whoami 指令用来查看当前账户是谁。 如上图所示,使用whoami指令,查看到现在…...
AI学习之自然语言处理(NLP)
自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学领域的交叉学科,旨在让计算机能够理解、处理和生成人类语言。以下为你详细介绍: 自然语言处理的关键技术 词法分析:将文本…...
全面解析锁服务设计:内存锁、数据库锁与分布式锁的选择与实现
在构建分布式系统时,锁服务通常用于控制多个线程或进程对共享资源的访问。为了灵活适配不同的锁实现方式,我们可以设计一个基础的锁服务接口,然后根据需求提供不同的实现。例如,内存锁、数据库锁和分布式锁。 1. 锁服务基础接口设…...
jenkins-系统配置概述
一. 引文: Jenkins除了强大的功能插件实现的持续交付集成外, 本身也是有一些比较重要的可配项。 接下来我们来看一看。 配置入口: 系统管理-->系统设置 二. 基础配置: 1.主目录(home directory): Jenkins所有的数据文件存放路径(可通过…...
《数据思维》之数据可视化_读书笔记
文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 数据之道,路漫漫其修远兮,吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准:准确、有…...
kafka消费堆积问题探索
背景 我们的商城项目用PHP写的,原本写日志方案用的是PHP的方案,但是,这个方案导致资源消耗一直降不下来,使用了20个CPU。后面考虑使用通过kafka的方案写日志,商城中把产生的日志丢到kafka中,在以go写的项目…...
一文掌握Docker
目录 1.快速入门 1.1.部署MySQL 1.2.命令解读 2.Docker基础 2.1.常见命令 2.1.1.命令介绍 2.1.2.演示 2.1.3.命令别名 2.2.数据卷 2.2.1.什么是数据卷 2.2.2.数据卷命令 2.2.3.挂载本地目录或文件 2.3.镜像 2.3.1.镜像结构 2.3.2.Dockerfile构建镜像 2.3.3.构建…...
慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板
UI库管理 UI库管理分为平台级和自建两种,其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用,自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下: 自建UI库新增界面: 注:平台级UI库不支…...
【学习笔记】Macbook管理多个不同的Python版本
在MacBook上管理不同项目的不同Python版本,可以使用多种方法。以下是一些常见的方法: 1. 使用 pyenv pyenv 是一个非常流行的工具,可以让你轻松安装和切换多个Python版本。以下是安装和使用 pyenv 的步骤: 安装 pyenv 安装依赖…...
前端如何设计一个回溯用户操作的方案
同一个项目,为什么我本地无法复现,只有客户的设备才复现? 如何获取用户的操作路径呢? 两种方案:埋点和rrweb 埋点就很简单了,将所有可能操作的节点都进行预埋数据;但埋点简单并不省心ÿ…...
WPF、控件模板(ControlTemplate)和数据模板(DataTemplate)
前言 在 WPF 中,控件种类丰富且功能非常完善。一个显著的优点是 WPF 提供了强大的自定义能力和灵活的用户界面表现,能够满足各种复杂的应用需求。其中,ControlTemplate 和 DataTemplate 是两个非常重要的概念,分别用于自定义控件…...
MAC上安装Octave
1. 当前最新版Octave是9.3版本,需要把mac os系统升级到14版本(本人之前的版本是10版本) https://wiki.octave.org/Octave_for_macOS octave的历史版本参考此文档:Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…...
RabbitMQ(三)
RabbitMQ中的各模式及其用法 工作队列模式一、生产者代码1、封装工具类2、编写代码3、发送消息效果 二、消费者代码1、编写代码2、运行效果 发布订阅模式一、生产者代码二、消费者代码1、消费者1号2、消费者2号 三、运行效果四、小结 路由模式一、生产者代码二、消费者代码1、消…...
一体机cell服务器更换内存步骤
一体机cell服务器更换内存步骤: #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…...