- 博客(60)
- 资源 (1)
- 收藏
- 关注
翻译 Don‘t Block on Async Code(不要阻塞异步代码)
这是一个在论坛和StackOverflow上反复出现的问题。我认为这是async新手在学习基础知识后最常问的问题。
2024-04-22 19:50:05 95
原创 C# 反射基础
反射(reflection)是运行中的程序查看自身或者外部程序集的元数据的行为。特性(Attributes)是一种特殊的类,它用于为程序中的其他程序结构(如类、方法、字段等)提供附加信息。
2024-04-20 20:34:24 674
原创 C#基础总结
装箱和拆箱是值类型与引用类型之间转换时发生的操作。装箱(Boxing):是将值类型转换为引用类型的一个过程。装箱时,值类型实例被包裹在一个新的对象中,并分配在堆上,这样它就有了一个引用地址,可以作为对象使用。拆箱(Unboxing):是将引用类型转换回原来的值类型。拆箱时,从堆上的对象中提取出值类型数据,并将其复制到一个栈上的临时位置,以便作为值类型使用。序列化是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化则是将这种形式的数据恢复为对象的过程。浅拷贝。
2024-04-20 20:30:50 808
原创 1.1入门指南(AutoMapper官方文档翻译)
AutoMapper是一个对象-对象映射器。对象-对象映射的工作原理是将一种类型的输入对象转换为不同类型的输出对象。AutoMapper的有趣之处在于,它提供了一些有趣的约定,将如何将类型A映射到类型B的繁琐工作解决掉。只要类型B遵循AutoMapper的既定约定,映射两个类型几乎不需要任何配置。
2023-10-05 16:52:49 389
原创 vs2022修改字段默认样式
默认情况下,VS2022通过快捷键,自动生成的字段样式为驼峰命名法,如下那怎么修改VS2022的字段默认样式呢?下面是修改的过程。
2023-09-26 20:57:40 328
原创 右键菜单添加 Open Git Bash
在使用 TortoiseGit 作为Git的可视化工具,但是会经常用到命令行操作,一般来说,安装了TortoiseGit后,右键会出现的命令。但是,可能由于某些原因,这个右键菜单选项不见了。下面就是重新添加此右键菜单的方法。
2023-09-26 20:36:43 1556
原创 Visual Studio 新建类从默认internal改为public
Visual Studio 新建类从默认internal改为public
2023-09-04 20:22:15 1355
翻译 发件箱模式(The Outbox Pattern)
有时,在处理业务操作时,需要在即发即弃()模式下与外部组件通信。外部服务消息总线邮件服务器相同的数据库,但不同的数据库事务另一个数据库下单后发送电子邮件向消息传递系统发送关于新客户端注册的事件在不同的数据库事务中处理另一个DDD聚合-例如在下订单以减少库存产品数量之后由此产生的问题是从技术角度来看,我们是否能够保证业务操作的原子性?
2023-01-24 21:33:45 583 1
翻译 .NET Core中的旁路缓存模式(Cache-Aside Pattern)
通常情况下,我们需要专注于优化应用程序的性能。有很多方法可以做到这一点,其中一种方法是缓存一些数据。在这篇文章中,我将简要描述旁路缓存模式()及其在 .NET Core中的简单实现。在这篇文章中,我描述了旁路缓存模式及其在 .NET Core中的主要实现。我还提出了增强设计,以少量的工作实现更优雅的解决方案。缓存快乐!🙂。
2023-01-24 20:04:58 308 1
翻译 处理领域事件:缺失的部分
前段时间我写了一篇关于发布和处理域事件的文章。此外,在其中一篇文章中,我描述了发件箱模式(The Outbox Pattern),它在不使用2PC协议的情况下为我们提供了与外部组件/服务集成时至少一次的交付(这次我想结合这两种方法来完成之前的文章。我将提出一个完整的解决方案,考虑到事务边界,使系统以结构化的方式来可靠地进行数据处理。在这篇文章中,我描述了如何在深系统中以响应式方式处理命令和领域事件。用于事件分派和事务边界管理的装饰器模式用于在单独事务中处理事件的发件箱模式工作单元模式(
2023-01-23 23:16:11 157
翻译 如何发布和处理领域事件
领域事件是建模领域中过去发生的事件信息,是DDD方法的重要组成部分。发布和处理领域事件的方法有很多种——通过静态类、返回它们、通过集合公开。领域事件应该在现有事务中处理(我的建议)对于非事务性操作,引入了领域事件通知。
2023-01-23 21:53:45 331
翻译 领域模型验证
我们可以根据范围将领域模型的验证分为两种类型——聚合范围和限界上下文()范围.在这篇文章中,领域模型验证涉及了很多内容。我们有两种类型的领域模型验证——聚合范围和限界上下文范围领域模型验证通常有3种方法使用验证对象、延迟验证或始终有效(抛出异常)总是有效的方法是首选对于限界上下文范围验证,有两种验证方法——将所有需要的数据传递到聚合的方法/构造函数或者创建领域服务(通常是出于性能原因)。
2023-01-23 20:36:26 284
翻译 REST API数据验证
这一次,我将描述如何保护REST API应用程序免受包含无效数据的请求(数据验证过程)的影响。然而,不幸的是,仅仅验证我们的请求是不够的。除了验证之外,我们还负责将相关消息和状态返回给API客户端。我想在这篇文章中处理这两件事。什么是数据验证?我发现最好的定义来自UNECE数据编辑组(UNECE Data Editing Group):一种旨在验证数据项的值是否来自给定(有限或无限)的可接受值集的活动。根据这个定义,我们应该验证从外部源进入应用程序的数据项,并检查它们的值是否可接受。
2023-01-23 13:23:02 255
翻译 使用EF的领域模型的封装和持久化透明(PI)
在之前的文章中,我介绍了如何使用原始SQL(读模型)和领域驱动设计(写模型)实现简单的CQRS模式。我想继续介绍主要集中在DDD实施的例子。在这篇文章中,我将描述如何尽可能多地利用最新版本的Entity Framework 2.2(译者注:现在已不是最新版本)来支持纯领域建模。我决定在GitHub上不断开发我的例子。我将尝试逐步添加新的功能和技术解决方案。我还将尝试扩展领域,使应用程序与实际应用程序相似。在琐碎的领域中很难解释DDD的某些方面。不过,我强烈建议您关注(follow)我的代码库。
2023-01-22 23:56:33 268
翻译 简单的CQRS实现与原始SQL和DDD
我经常遇到关于CQRS模式实现的问题。甚至比我经常看到的"是在上下文中用ORM还是纯SQL访问数据库哪个更快”的讨论遇到的更多。在这篇文章中,我想向你展示如何使用. Net Core快速实现简单的REST API应用程序。开宗明义,这是CQRS最简单的版本——通过写模型()的更新立即更新了读模型(Read Model),因此我们在这里不保证最终的一致性(然而,许多应用程序不需要最终的一致性,因为推荐使用两个单独的模型对读写进行逻辑划分,这种做法在大多数解决方案中更加有效。
2023-01-22 22:42:50 259
原创 WPF ListBox等ItemsControl交替(Alternation)变化效果
最近遇到一个需求,就是让表格等控件的内容显示交替变化。交替变化的内容,有利于缓解用户的视觉疲劳,个人感觉是一个很好的需求,要怎么实现呢?先看看效果吧!AlternationCount 属性指定了ItemsControl按AlternationCount 值轮换数量。如果这个值是2,那么内容(Item)相关每两个交替变化;如果这个值是3,则每三个交替变化;2.Xaml.cs总结总之,时显示方式就是ItemsControl的AlternationCount 属性搭配Trigger。另外,MSDN官方示
2022-12-04 20:28:18 1013
原创 WPF 通过依赖属性Value更新长历史图表
最近在实现一些控件,诸如仪表盘和长历史图表等。这些控件对外的接口只有一个依赖属性Value。通过绑定,可以实时接收后台产生的数据。get {} set {对于一般的控件而言,如仪表盘,通过向提供更改通知的回调就可以实现仪表盘上的指针位置的更新。然而,对于长历史图表而言,它还有一个额外的要求保存历史的数据。这时,问题就出现了。如果后台产生了连续的相同的数据,那么的回调将不会被调用,进而导致长历史图只会保存连续变化的数据。这显然不是我们想要的效果。那如何解决这个问题呢?可以控件内部编写。
2022-11-20 11:52:20 507
原创 C#获取程序集中的所有控件类型
/ 获取程序集中定义的所有公共类型 var types = assembly . GetExportedTypes();
2022-11-13 12:24:59 1151
原创 LeetCode 370. 区间加法(Range Addition)
假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组 A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加 inc。请你返回 k 次操作后的数组。示例:输入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]]输出: [-2,0,3,5,3].
2021-11-07 13:26:13 521
原创 LeetCodeN598.范围求和 Ⅱ(Range Addition Ⅱ)
给定一个初始元素全部为0,大小为 m*n 的矩阵M以及在M上的一系列更新操作。操作用二维数组表示,其中的每个操作用一个含有两个正整数a 和 b 的数组表示,含义是将所有符合0 <= i < a 以及 0 <= j < b 的元素M[i][j]的值都增加 1。在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。示例 1:输入:m = 3, n = 3operations = [[2,2],[3,3]]输出: 4解释:初始状...
2021-11-07 13:25:41 120
原创 C# 求二维数组中最小的x和最小的y
方法一:int minx = mint miny = n;foreach (int[] array in array2D) { minx = Math.Min(minx , array [0]); miny = Math.Min(miny , array [1]);}方法二:Array.Sort(array2D,(a,b)=>a[0].CompareTo(b[0]));intminx=array2D[0][0];Array.Sort(array2D,(a,.
2021-11-07 11:34:38 310
原创 C# m行n列的二维(锯齿形)数组的定义
int m = 3; int n = 4; int[][] matrix= new int[m][]; for (int i = 0; i < matrix.Length; i++) { matrix[i] =new int[n]; }
2021-11-07 10:41:05 468
原创 LeetCode268.丢失的数字
给定一个包含 [0, n]中n个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 3:...
2021-11-06 21:38:50 97
原创 LeetCode452.用最少数量的箭引爆气球
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的...
2021-11-06 21:30:19 138
原创 贪心(贪婪)算法
LeetCode575. 分糖果LeetCode455. 分发饼干LeetCode435.无重叠区间LeetCode55.跳跃游戏LeetCode45.跳跃游戏Ⅱ
2021-11-06 20:48:01 122
原创 LeetCode435.无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。示例 3:输入.
2021-11-06 20:15:27 211
原创 C# 二维数组排序
//定义一个2维数组int[][] array = { new[] { 3, 1 }, new[] { 1, 3 }, new[] { 4, 2 } };//按数组的第2个数排序Array.Sort(array, (a, b) => a[1].CompareTo(b[1]));
2021-11-06 19:25:15 2350
原创 C# 二维数组获取其行数和列数
//定义2维数组int[][] array = new int[2][] { new int[] {123}, new int[] {3,4,5 }};int row = array.Rank; //获取维数,这里表示行数int col = array.GetUpperBound(array.Rank -1 ) +1; //获取二维数组的列数...
2021-11-06 18:47:57 859
原创 LeetCode45.跳跃游戏Ⅱ
给你一个非负整数数组nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。示例 1:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。示例 2:输入: nums = [2,3,0,1,4]输出: 2...
2021-11-06 16:21:56 114
原创 LeetCode55.跳跃游戏
55. 跳跃游戏难度中等1471收藏分享切换为英文接收动态反馈给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总...
2021-11-06 14:57:03 152
原创 LeetCode1218. 最长定差子序列
给你一个整数数组arr和一个整数difference,请你找出并返回 arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。示例 1:输入:arr = [1,2,3,4], difference = 1输出:4解释:最长的等差子序列是 [1,2,3,4]。示例2:输入:arr = [1,3,5,7], difference = 1输出...
2021-11-05 20:34:05 91
原创 LeetCode367.有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如sqrt 。示例 1:输入:num = 16输出:true示例 2:输入:num = 14输出:false提示:1 <= num <= 2^31 - 1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-perfect-square...
2021-11-04 22:18:03 88
原创 LeetCode407. 接雨水 II
给你一个m x n的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。示例 1:输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]输出: 4解释: 下雨后,雨水将会被上图蓝色的方块中。总的接雨水量为1+2+1=4。示例2:输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3...
2021-11-03 21:03:56 137
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人