写程序和拼积木是一样的,首先要知道我们这堆积木中都有那些基本模块,然后再非常清晰知道自己这次要拼一个什么东西,那接下来就是拼搭环节,在拼搭过程中,有时还会拆除,重新来搭。 其实开发软件也是一样的,这篇先理一下desktop框架下“搭积木”的思路。 desktop框架:desktop在.net世界里面有两种框 架,winform框 架和wpf框架。winform是基于GDI+,WPF(win
写程序和拼积木是一样的,首先要知道我们这堆积木中都有那些基本模块,然后再非常清晰知道自己这次要拼一个什么东西,那接下来就是拼搭环节,在拼搭过程中,有时还会拆除,重新来搭。 其实开发软件也是一样的,这篇先理一下desktop框架下“搭积木”的思路。 desktop框架:desktop在.net世界里面有两种框 架,winform框 架和wpf框架。winform是基于GDI+,WPF(win
高层模块不应该依赖底层模块,两都都应该依赖抽象一个三层的Demo/// <summary>/// 人员实体类/// </summary>class Person{ public int ID { get; set; } public string Name { get; set; } public bool Sex { get; set; }}/// &l
高层模块不应该依赖底层模块,两都都应该依赖抽象一个三层的Demo/// <summary>/// 人员实体类/// </summary>class Person{ public int ID { get; set; } public string Name { get; set; } public bool Sex { get; set; }}/// &l
对修改是封闭的,对扩展是开放的。 新需求对于已上线的系统是司空见惯的,最佳实践告诉我们对生产中的代码在扩展功能时不要直接修改,而是去重写一个新的方法,新类型或新服务去扩展它,这道理很简单,任何即有代码的变更,都可能带来灾难。(除非100%把握,或有100%把握的胆子,当然也有一个工种,测试能帮我们来挡刀) 常见的扩展方式都有什么呢?新建方式: 对于一些独立的新需求,可能通过增加一个方法,就能
对修改是封闭的,对扩展是开放的。 新需求对于已上线的系统是司空见惯的,最佳实践告诉我们对生产中的代码在扩展功能时不要直接修改,而是去重写一个新的方法,新类型或新服务去扩展它,这道理很简单,任何即有代码的变更,都可能带来灾难。(除非100%把握,或有100%把握的胆子,当然也有一个工种,测试能帮我们来挡刀) 常见的扩展方式都有什么呢?新建方式: 对于一些独立的新需求,可能通过增加一个方法,就能
最近工作需要,在调研BMP产品(开源和商用),重点了解了activiti和它的商业产品Alfresco Process Services,这是java的体系,成熟,完善(三方开源库是java多年开源积累下的最宝贵的财富),出身.neter的我自然就想看看.net世界里有没有类似的产品。于是就找到两篇关于elsa的文章,一篇是善友兄的《推荐一个很棒的开源工作流elsa-core》,另一
最近工作需要,在调研BMP产品(开源和商用),重点了解了activiti和它的商业产品Alfresco Process Services,这是java的体系,成熟,完善(三方开源库是java多年开源积累下的最宝贵的财富),出身.neter的我自然就想看看.net世界里有没有类似的产品。于是就找到两篇关于elsa的文章,一篇是善友兄的《推荐一个很棒的开源工作流elsa-core》,另一
单一职责是降低耦合度的指导思想,适用于一个微服务,一个类型,一个方法。微服务层: 微服务一般按业务的领域来进行拆分:药房微服务就是药房的业务,护士站微服务就是护士站的业务,广义上没有什么问题,但对于一些共用业务,就犯难了,究竟放在那个微服务里?还是合并两个微服务?其实这里就单一,把共用的抽离出来,不一定做成另一个微服务,可以统一做成类库,供两个微服务调用,如果业务有细微差别,可以通过设计模式
单一职责是降低耦合度的指导思想,适用于一个微服务,一个类型,一个方法。微服务层: 微服务一般按业务的领域来进行拆分:药房微服务就是药房的业务,护士站微服务就是护士站的业务,广义上没有什么问题,但对于一些共用业务,就犯难了,究竟放在那个微服务里?还是合并两个微服务?其实这里就单一,把共用的抽离出来,不一定做成另一个微服务,可以统一做成类库,供两个微服务调用,如果业务有细微差别,可以通过设计模式
官方和老人言,asp.net core中尽量用异步,为什么呢?接下来是个小demo,看看同步异步的差别吧,或许通过这个demo,就明白官方和老人的良苦用心了。1、创建一个sql server的表CREATE TABLE [dbo].[Students]( [StuNo] [varchar](50) NOT NULL, [Name] [varchar](50) NULL, [CardID]
官方和老人言,asp.net core中尽量用异步,为什么呢?接下来是个小demo,看看同步异步的差别吧,或许通过这个demo,就明白官方和老人的良苦用心了。1、创建一个sql server的表CREATE TABLE [dbo].[Students]( [StuNo] [varchar](50) NOT NULL, [Name] [varchar](50) NULL, [CardID]
Jaeger是收集全链路跟踪的信息,在Jaeger收集的信息中,有请求的url信息,有每个请求的时间间隔,借助这些信息可以进行报警,比如一次较长的请求,或者是某些请求的次数和先后等。不管报警的业务规则是什么,首先得收集Jaeger中的信息。 Jaeger有api可以提供这些信息,比如 /api/services,获取所有服务 /api/traces?service={servicenam
Jaeger是收集全链路跟踪的信息,在Jaeger收集的信息中,有请求的url信息,有每个请求的时间间隔,借助这些信息可以进行报警,比如一次较长的请求,或者是某些请求的次数和先后等。不管报警的业务规则是什么,首先得收集Jaeger中的信息。 Jaeger有api可以提供这些信息,比如 /api/services,获取所有服务 /api/traces?service={servicenam
上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。引入JaegerSharp包(或发布到自己的Nuget库里引用)WebAPI01的Startupusing JaegerSharp;using Microsoft.AspNetCore.Builder;using Microsoft.
上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。引入JaegerSharp包(或发布到自己的Nuget库里引用)WebAPI01的Startupusing JaegerSharp;using Microsoft.AspNetCore.Builder;using Microsoft.
随着微服务的普及,微服务间的调用全链路跟踪也火了起来,Jaeger(https://www.jaegertracing.io/)是CNCF孵化的全链路跟踪型项目,在.net core中,提供了一个Jaeger的Nuget(https://github.com/jaegertracing/jaeger-client-csharp)包来使用。 本例封装就是用这个Nuget包来做成asp.net
随着微服务的普及,微服务间的调用全链路跟踪也火了起来,Jaeger(https://www.jaegertracing.io/)是CNCF孵化的全链路跟踪型项目,在.net core中,提供了一个Jaeger的Nuget(https://github.com/jaegertracing/jaeger-client-csharp)包来使用。 本例封装就是用这个Nuget包来做成asp.net
最近设计架构时,有个场景,首先是前后端分离,再就是一前端对多后端,这里需要解决两件事,一是前端的html,js,css需要一个host;二是需要一个api网关,能组织后端的api服务。有很多反向代理产品能实现,这里选择了Nginx来实现。 下面是在一个前端的html文件中调用后端api的例子,前端是不知道后端的api是不是组合的,所以只用相对路径请求就ok<!DOCTYPE html&
最近设计架构时,有个场景,首先是前后端分离,再就是一前端对多后端,这里需要解决两件事,一是前端的html,js,css需要一个host;二是需要一个api网关,能组织后端的api服务。有很多反向代理产品能实现,这里选择了Nginx来实现。 下面是在一个前端的html文件中调用后端api的例子,前端是不知道后端的api是不是组合的,所以只用相对路径请求就ok<!DOCTYPE html&
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 &nb