HueiFeng

Microsoft MVP

All Posts


.NET RulesEngine(规则引擎)

一次偶然的机会,让我拿出RulesEngine去完成一个业务,对于业务来说主要是完成一个可伸缩性(不确定的类型,以及不确定的条件,条件的变动可能是持续增加修改的)的业务判断。比如说完成一个成就系统,管理员可创建,对于成就来说有一次性解锁、日常、周常式,还有随时重置,每次达成都触发的,面对着成就任务的增加,那对于程序员来说,如果每次都去增加修改这些成就任务简直是太头疼了。好了,对此大家应该有一个简单的了解了,那跟着笔者往下走,我们看看如何在.NET中使用非常少的代码去完成一个简单的动态逻辑处理。 RulesEngine 概述 RulesEngine是Microsoft推出的一个规则引擎项目,用于系统中抽象出的业务逻辑/规则/策略。在我们开发的过程中,避免不了的是跟这种反反复复的业务逻辑进行处理,而对于这种动态的规则来说的话,它是比较优雅的一种方式,使用我们减少了对我们代码或者说项目的修改。 …

.NET Core .NET .NET5

在ASP.NET Core中使用ViewComponent

前言 在之前的开发过程中,我们对于应用或者说使用一些小的组件,通常使用分布页(partial view),再往前在Web Form中我们会进行应用WEB Control,好吧提及一个关键性代码TagPrefix:TagName,通过这种的标记我们便可以在我们web form中进行引入我们的组件,当然自从.NET MVC之后呢,就已经没有了WebControl,而对于.NET Core后,又多了一个特性ViewComponent。 对于ViewComponent看起来它类似于小的控制器,而对于我们小的组件或者小部分通用型功能,可通过ViewComponent进行实现,比如说留言栏、菜单等等。 ViewComponent是由两部分组成,一部分是类(通常该类集成与ViewComponent),而另外一部分是视图(Razor和普通的View一样),当然ViewComponent同样也支持POCO, …

.NET Core ASP.NET Core .NET .NET5

.NET初探源代码生成(Source Generators)

前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值的。 实现ISourceGenerator 集成ISourceGenerator接口,实现接口用于代码生成策略,它的生命周期由编译器控制,它可以在编译时创建时创建并且添加到编译中的代码,它为我们提供了编译时元编程,从而使我们对C#代码或者非C#源文件进行内部的检查。 [Generator] class CustomGenerator: ISourceGenerator { public void Initialize(GeneratorInitializationContext context) { throw …

.NET Core .NET

.NET探索模型路由约定实现伪静态

概述 IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空间中, 代表着Razor Page路由设置,换句话说我们可以通过实现该接口覆盖默认的实现。 该接口需要实现一个成员void Apply(PageRouteModel model)。通过这个方法,我们可以访问有关当前路由设置的元数据,并根据需要对其内容进行修改。 下面示例,将解决提供一个伪静态的解决方案,因此我们可以通过index.html about.html....去访问我们的页面,也就是说我们可以从Index-Index.html的支持 public class HtmlExtensionPageRouteModelConvention : …

.NET .NET5

.NET中使用DebuggerDisplay轻松定制调试

前言 对于调试的方式有多种,不过在今天我们将看到的监视窗口对变量的监视,当然在这里我们是定制内部的变量值,或者说变量的显示与计算的内容。 注:监视窗口在调试时可以一次显示多个变量。“快速监视”对话框一次显示一个变量。 file DebuggerDisplayAttribute 在下面示例中,我们在类上添加DebuggerDisplay,添加字符串:("Name={Name},Age={Age}"): class Program { static void Main(string[] args) { Student student = new Student() { Name = Mr.A, Age = 18 }; …

.NET Debugging

.NET探索平台条件编译

前言 今天偶然机会,翻了一下大学期间的书籍《C程序设计》,好吧,当我翻着翻着,翻到了符号常量(#define指令)中,是啊,这是一个预处理器指令,记得在Magicodes.IE中针对平台选择不同的库,哈哈,这是一个典型的根据平台进行条件处理,好吧, 根据这些内容,让我感觉在今天,我需要对#define指令以及在.NET中的平台条件处理,以及平台的条件编译进行记录一下。 file define 我们可通过define来定义符号,然后将符号用在#if指令表达式中,如下所示: #define PI 通过上面这些内容可能很难去了解这该如何使用,其实#define在我们的编码过程中也是很少去使用的,我们继续往下看。 其实对于预处理器,在我们调试以及运行时的作用是比较大的,比如说对某些代码限制编译,另一方变其实还可以对代码进行环境或者版本的控制,这些都是Ok的,最后我们结合着控制语句#if来看一下: …

.NET MSBuild

【Azure DevOps系列】Azure DevOps EFCore命令式脚本部署到SQL数据库

构建迁移脚本 为了构建迁移脚本,我们将需要使用EF Tools for Command Line Interface。这些工具在Microsoft.EntityFrameworkCore.Tools提供。 迁移脚本 现在我们将通过 dotnet ef migrations script –p path to your csproj with migrations -o $(Build.ArtifactStagingDirectory)\migrations\scripts.sql –i来迁移我们的脚本,在如下代码片段中我将脚本进行迁移出来并且输出到指定的路径 -o $(Build.ArtifactStagingDirectory)/migrations/scripts.sql中, -i代表生成可用于任何迁移的数据库的脚本。 - task: CmdLine@2 …

Azure DevOps

探索.NET平台中的SIMD内在函数Vector

概述 Vector(向量)是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而Vector刚好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。 什么是SIMD? SIMD是Single Instruction Multiple Data的缩写,通常中文译为单指令多数据流,通俗来讲的话是:对多个数据执行同一个CPU指令,以达到平行运算的目的. 在GPU之前我们会通过CPU来运行该项技术来增加图片的运算速度,例如Intel的MMX、SSE、SSE2、AVX,AMD的3DNow!等等,都是来使用SIMD 为基础的概念,在GPU技术突飞猛进的今天,CPU的SIMD技术很少用在了图片运算方面了,更多的是在资料库或者其他用途上。 SIMD 它适用于机器 …

.NET .NET5

Vs编译时RazorTagHelper - DOTNET_HOST_PATH is not set

今天听朋友说遇到一个问题,打开一个aspnetcore2.2的项目工程,发现挺有意思,缺少环境变量DOTNET_HOST_PATH file 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4018 “RazorTagHelper”任务意外失败。 System.InvalidOperationException: DOTNET_HOST_PATH is not set 在 Microsoft.AspNetCore.Razor.Tasks.DotNetToolTask.get_DotNetPath() 在 Microsoft.AspNetCore.Razor.Tasks.DotNetToolTask.GenerateFullPathToTool() 在 Microsoft.Build.Utilities.ToolTask.ComputePathToTool() …

.NET Core

.NET必知的EventCounters性能指标监视器

在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener. 使用dotnet-counters dotnet-counters是一个性能指标监视工具,用于临时运行状态监视和初级性能调查。它可以观察通过 EventCounter API发布的性能计数器值。例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中引发的异常率,以了解在使用 PerfView 或 dotnet-trace 深入调查更严重的性能问题之前是否有任何可疑操作。 -- 摘自 dotnet-counters 命令 dotnet-counters collect dotnet-counters list dotnet-counters monitor dotnet-counters ps 安装dotnet- …

.NET Core .NET .NET5