.NET Core

.NET 5 尝鲜

邮差的信 提交于 2020-08-12 08:08:03
.NET 5 尝鲜 - 开源项目TerminalMACS WPF管理端支持.NET 5 一个使用 Prism 作为模块化框架、基于多个开源控件库作为UI控件选择、集成开源 UI 界面设计的 .NET 5 WPF 客户端项目。 项目名称:TerminalMACS WPF管理端 项目开源地址: Github: https://github.com/dotnet9/TerminalMACS.ManagerForWPF Gitee: https://gitee.com/dotnet9/TerminalMACS.ManagerForWPF 作者:Dotnet9 1. 特性 使用 .NET 5 开发,体验最新 .NET 平台(和 .NET Core 3.1 无缝兼容) .NET 5 是 .NET Framework 和 .NET Core 的未来,最终将成为一个统一平台,.NET5将包含ASP.NET核心、实体框架核心、WinForms、WPF、Xamarin 和 ML.NET。 基于 Prism 8 搭建模块化框架,方便程序扩展 Prism为程序设计提供指导,旨在帮助用户更加容易的设计和构建丰富、灵活、易于维护WPF桌面应用程序。Prism使用设计模式(如MVVM,复合视图,事件聚合器),帮助你创建一个松耦合的程序。遵循这些设计模式原则,将目标程序解耦成独立的模块

分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的入门级微服务开发框架

落爺英雄遲暮 提交于 2020-08-12 05:38:58
集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 https://github.com/PeyShine/Demo.MicroServer Apollo配置中心 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 由于各个项目配置都需要读取基础的配置信息,这边在内网的Centos(101)上部署了Apollo的环境,并为项目添加了一些基础配置信息,配置如图 Consul Consul是一种服务网格解决方案,提供具有服务发现,健康检查,Key/Value存储,多数据中心等功能。 在内网101启动Consul服务,这里为了测试,直接在本地将用户服务实例分别在三个端口启动起来,实际生产中这些服务可能部署在不同的机房不同的机器,他们之间组成一个服务的集群,服务提供一个心跳检测的方法,用于consul定时检测服务实例是否健康,启动时在consul中进行一次注册,这个就是经常说的‘服务注册与发现’中的服务注册,三个服务实例截图如下 注册完成之后打开consul的ui界面可以看到

C# CLR 聊聊对象的内存布局 一个空对象占用多少内存

我怕爱的太早我们不能终老 提交于 2020-08-12 01:45:56
在 C# 中的对象大概可以分为三个不同的类型,包括值类型、引用类型和其他类型。本文主要讨论的是引用类型对内存空间的占用情况。在讨论开始之前我想问问大家,一个空的对象会占用多少内存空间?当然这个问题本身就有问题,因为没有区分栈空间与堆空间的内存空间。其实小伙伴会发现这不是一个好回答的问题,因为似乎没有一个可以认为标准的标准答案。请让我为你详细聊聊对象的内存布局 在开始之前,先广告一下农夫的书 《.NET Core底层入门》 这本书写的非常底层,内存这一篇章写的特别棒。如果看本文之后觉得更加迷糊了,请看农夫大大的书 开始的问题其实问题本身不算对,为什么呢?因为咱 .NET 可以在 x86 和 x64 和 ARM 等运行,而运行时包括了 .NET Framework 和 .NET Core 还有 mono 和 .NET Micro Framework 等,这些表现有稍微的不同。至少有趣的 .NET Framework 有超级多个不同的版本,本考古学家也不能确定这些版本之间是否存在差异,只是听小伙伴吹过。而 .NET Micro Framework (NETMF) 本身就是设计在极度小的内存下运行,里面对引用类型做了很多有趣的优化,而我仅仅知道有优化,具体做了什么就不知道了,也不想知道 而 .NET Core 下还有一个有趣的技术叫 .NET Native

实时web应用方案——SignalR(.net core)

拟墨画扇 提交于 2020-08-12 00:31:18
何为实时 先从理论上解释一下两者的区别。 大多数传统的web应用是这样的:客户端发起http请求到服务端,服务端返回对应的结果。像这样: 也就是说,传统的web应用都是客户端主动发起请求到服务端。 那么实时web应用呢?它不需要主动发起请求,服务端可以主动推送信息到客户端。 举栗子的话,实时聊天工具、web游戏等都可以算是实时应用。 什么是SignalR 如果想做一个实时应用,最好用web socket。很早以前我也写过web socket的实现方式,但不够全面,这里再补上一篇。 来说说signalR,它是一款开源的实时框架,可以使用三种方式实现通信(long polling、server sent events、web socket)。它很好的整合了底层技术,让我们可以不用关注底层技术实现而把精力聚焦在业务实现上。一个完整的signalR包括客户端和服务端,服务端支持net core/net framework,还支持大部分客户端,比如浏览器和桌面应用。 回落机制 为了兼容不同浏览器(客户端)和服务端,signalR采用了回落机制,使得它可以根据情况协商使用不同的底层传输方式。假如浏览器不支持web socket,就自动降级使用sse,再不行就long polling。当然,也可以禁用这种机制,指定其中一种。 三种通信方式 long polling(长轮询)

.net core 基于Dapper 的分库分表开源框架(core-data)

社会主义新天地 提交于 2020-08-12 00:12:06
一、前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于 Dapper 的分库分表开源框架 core-data 的强大功能,更好的提高开发过程中的效率; 在数据库的数据日积月累的积累下,业务数据库中的单表数据想必也越来越大,大到百万、千万、甚至上亿级别的数据,这个时候就很有必要进行数据库读写分离、以及单表分多表进行存储,提高性能,但是呢很多人不知道怎么去分库分表,也没有现成的分库分表的成熟框架,故不知道怎么下手,又怕影响到业务;现在我给大家推荐 core-data 的分库分表开源框架。框架开源地址: https://github.com/overtly/core-data 二、基础 2.1 回顾 这里先来回顾下我上一篇文章中的技术栈路线图,如下: 今天从这张技术栈图中来详细分享一切的基础数据库底层操作ORM。 2.2 core-data主要优势: 上一篇文章 .Net 微服务架构技术栈的那些事 中简单的介绍了 core-data 主要优势,如下: 官方建议使用DDD 领域驱动设计思想开发 支持多种数据库(MySql / SqlServer / SQLite ),简单配置添加链接的配置即可 支持分表操作,自定义分表策略的支持 支持表达式方式编写,减少写Sql语句机械性工作 可对Dapper 进行扩展 性能依赖于Dapper 本身的性能,Dapper 本身是轻量级ORM

.NET Core 3.1 跨域请求 (CORS)

江枫思渺然 提交于 2020-08-11 23:50:17
.NET Core 3.1 跨域请求 (CORS) 在用ajax进行请求服务器资源时如果协议+主机名+端口号 (如存在)相同则允许交互,否则会出现跨域问题,不能访问和操作其他域下的资源。常用解决方式有在前端使用jsonp和在后端启用CORS。 jsonp可以支持get请求,但不支持post请求。完美的解决方案还是服务器端启用CORS。在.NET Core 3.1 启用CORS变得非常简单,不需要像早期的.NET CORE版本需要手动安装CORS程序包,只需要2步就可以完成。 1、添加策略 打开服务器端项目的“Startup.cs”文件,找到ConfigureServices(IServiceCollection services)方法,添加如下代码。 services.AddCors(options => { options.AddPolicy("any", builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); }); 代码表示在注入cors中间件: “any”表示策略名称,可以随便起,在第2步会用到; AllowAnyOrigin表示允许任何域; AllowAnyMethod表示允许任何方法; AllowAnyHeader表示允许任何消息头。 如果是允许指定的域、方法

重学c#系列——非托管实例(五)

笑着哭i 提交于 2020-08-11 20:59:37
前言 托管资源到是好,有垃圾回收资源可以帮忙,即使需要我们的一些小小的调试来优化,也是让人感到欣慰的。但是非托管资源就显得苍白无力了,需要程序员自己去设计回收,同样有设计的地方也就能体现出程序员的设计水平。 托管类在封装对非托管资源的直接引用或者间接引用时,需要制定专门的规则,确保非托管资源在回收类的一个实例时释放。 为什么要确保呢? 是这样子的,画一个图。 上图中托管中生成并引用非托管,一但非托管和托管中的引用断开(托管资源被回收),那么这个时候非托管资源还在,那么释放这个问题就有一丢丢困难。 常见的有两种机制来自动释放非托管资源。 声明一个构析函数作为一个类的一个成员。 在类中实现System.IDisposable. 好的,接下来就开始看例子吧。 正文 构析函数 先从构析函数看起吧。 class Resource { ~Resource() { //释放资源 } } 在IL中是这样子的。 protected override void Finalize() { try { //构析函数写的 } finally { base.Finalize(); } } 简单介绍一下这个Finalize 是一个终结器,我们无法重写,文档中原文是这样子的。 从包装非托管资源的 SafeHandle 派生的类(推荐),或对 Object.Finalize 方法的重写。 SafeHandle

[ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期

我的梦境 提交于 2020-08-11 20:53:45
生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例。虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的。在我们提供的 依赖注入框架Cat 中,我们已经模拟了三种生命周期模式的实现原理,接下来我们结合“服务范围”的概念来对这个话题做进一步讲述。 一、服务范围(Service Scope) 对于依赖注入框架采用的三种生命周期模式(Singleton、Scoped和Transient)来说,Singleton和Transient都具有明确的语义,但是Scoped代表一种怎样的生命周期模式,很多初学者往往搞不清楚。这里所谓的Scope指的是由IServiceScope接口表示的“服务范围”,该范围由IServiceScopeFactory接口表示的“服务范围工厂”来创建。如下面的代码片段所示,IServiceProvider的扩展方法CreateScope正是利用提供的IServiceScopeFactory服务实例来创建作为服务范围的IServiceScope对象。 public interface IServiceScope : IDisposable { IServiceProvider ServiceProvider { get ; } } public interface

.NET Core Dto映射(AutoMapper)

陌路散爱 提交于 2020-08-11 19:29:40
我们假设一个场景, 采用EF Core+Web Api, 这时候可能会出现EF Core中的Entity Model和在项目中使用的Model之间对应关系出现偏差, 如果使用属性意一一对应, 不免会有大量的工作量 好了,接下来直接上代码来说明。 EntityModels.Employee.cs public class Employee { public Guid Id { get; set; } public Guid CompanyId { get; set; } public string EmployeeNo { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Gender Gender { get; set; } public DateTime DateOfBirth { get; set; } public Company Company { get; set; } } Models.EmployeeDto.cs public class EmployeeDto { public Guid Id { get; set; } public Guid CompanyId { get; set; } public string

.NET Core 的 Docker 容器目录乱码问题

强颜欢笑 提交于 2020-08-11 19:16:34
现象 使用 docker exec -ti <容器名> bash 进入容器,使用 ls 命令列出的数据里面,中文没有正常显示。 原因 就是对应的 Shell 字符集不正确的问题,调整对应的字符集为 UTF-8 即可。 解决 首先执行 locale -a ,查看输出的内容里面是否有 C.UTF-8 字符集。 执行 locale 查看当前的字符集,如果均为 POSIX 说明有问题,需要进行变更。 变更的方法很简单,创建/更改一下环境变量即可。 export LC_ALL="C.UTF-8" 上面这种方法仅对当前会话有效,如果想永久生效,将上面这句话放到对应的 Shell 的 Profile 里面即可。 来源: oschina 链接: https://my.oschina.net/u/4329429/blog/4460862