-
你写的Try...Catch真的有必要么?
所属栏目:[大数据] 日期:2021-05-21 热度:191
很多人喜欢用Try...Catch把每一个方法都包裹起来,可是真的有必要么? 为什么要这样做?我估计是大家被BUG吓怕了,生怕生产环境出现各种莫名其妙的错误,比如最经典的NullReferenceException,可问题是你用Try...Catch包裹起来后错误是不会爆出来了,但是执行[详细]
-
使用OAuth打造webapi认证服务供自己的客户端使用
所属栏目:[大数据] 日期:2021-05-21 热度:111
一、什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不是Authentication(认证)。用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍。 二、名词定义[详细]
-
WebAPI的一种单元测试方案
所属栏目:[大数据] 日期:2021-05-21 热度:57
大家是如何对webApi写测试的呢? 1.利用Fiddler直接做请求,观察response的内容。 2.利用Httpclient做请求,断言response的内容。 3.直接调用webApi的action,这种方式的测试跟真实的调用还是有一定差距,不够完美。 接下来我介绍一种webApi的in-memory调用方[详细]
-
C#中的线程四(System.Threading.Thread)
所属栏目:[大数据] 日期:2021-05-21 热度:54
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 ? ?System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无返回值 1 public static void Start1() 2 { 3 Console.WriteLine( " this is main thread!:{0},{1} " ,Sys[详细]
-
面向过程,面向对象,函数式对同一个问题的思考方式
所属栏目:[大数据] 日期:2021-05-21 热度:51
我之所以对函数式代码感兴趣是因为函数式代码富有表现力,可以使用简短、紧凑的代码完成工作,同时能对特定的问题给出优雅的解决方案。现代的编程语言不约而同的朝着面向对象、函数式、动态、解释执行的方向发展,例如Ruby,Swift。而另一些语言则更加强调函[详细]
-
angular ng-repeat+sortable 拖拽demo
所属栏目:[大数据] 日期:2021-05-21 热度:63
由于项目需求,需要使用angular 实现列表的增、删、改,并且列表支持拖拽。 看了下angular-ui 里面的sortable组件,使用起来也是非常简单,几十行代码就完成了所需功能。 我现在懒得想如何使用jquery完成该功能,不过我能肯定的是使用jquery完成这个功能,代[详细]
-
EventAggregator, EventBus的实现
所属栏目:[大数据] 日期:2021-05-21 热度:85
系列主题:基于消息的软件架构模型演变 ? .net中事件模型很优雅的实现了观察者模式,同时被大量的使用在各种框架中。如果我们非要给事件模型挑毛病,我觉得有两点: 实现起来略微繁琐 正如我们上篇文章分析,事件模型在特定的情况下会发生内存泄漏 于是我们[详细]
-
.Net中的反应式编程(Reactive Programming)
所属栏目:[大数据] 日期:2021-05-21 热度:179
系列主题:基于消息的软件架构模型演变 ? 一、反应式编程(Reactive Programming) 1、什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LINQ风格编写基于观察者模式的异步编程模型。简单点说Rx = Observables + LINQ + Schedulers。 2[详细]
-
分享一个简单程序(webApi+castle+Automapper+Ef+angular)
所属栏目:[大数据] 日期:2021-05-21 热度:59
前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题)。把代码分享出来。整个程序没有做任何架构。但是麻雀虽小,用到的技术也没少。WebApi+Castle+AutoMapper+Ef+angular,日志记录Log4net。初学者可以学习借鉴,虽然[详细]
-
C#函数式编程
所属栏目:[大数据] 日期:2021-05-21 热度:70
提起函数式编程,大家一定想到的是语法高度灵活和动态的LISP,Haskell这样古老的函数式语言,往近了说ruby,javascript,F#也是函数式编程的流行语言。然而自从.net支持了lambda表达式,C#虽然作为一种指令式程序设计语言,在函数式编程方面也毫不逊色。我们在[详细]
-
再谈扩展方法,从string.IsNullOrEmpty()说起
所属栏目:[大数据] 日期:2021-05-21 热度:91
string.IsNullOrEmpty()这个方法算得上是.net中使用频率最高的方法之一。此方法是string的一个静态方法,类似的静态方法在string这个类中还有很多。那么这样的方法作为静态方法是否合理呢?如果我们从面向对象的角度出发,我们会发现这种方案不是十分符合面[详细]
-
你写的return null正确吗?
所属栏目:[大数据] 日期:2021-05-21 热度:56
上次一篇“你写的try…catch真的有必要吗”引起了很多朋友的讨论。本次我在code review又发现了一个问题,那就是有人有意无意的写出了return null这样的代码,例如: public User GetUser(Guid userId) { if ( /*for some reason*/) return null; return DB.[详细]
-
Controller的生命周期是Transient还是PerWebRequest?
所属栏目:[大数据] 日期:2021-05-21 热度:70
当我们用在MVC总使用IoC时,大家的Controller生命周期(lifestyle)是以哪种方式注册的呢? 之前我一直没有思考过这个问题。众所周知在MVC开发过程中,大部分的组件都是以PerWebRequest的方式注册到容器的,Controller也不例外,以Castle为例,注册Controller[详细]
-
Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper
所属栏目:[大数据] 日期:2021-05-21 热度:71
??????? 表达式树是LINQ To everything 的基础,同时各种类库的Fluent API也 大量使用了Expression Tree。还记得我在不懂expression tree时,各种眼花缭乱的API 看的我各种膜拜,当我熟悉expression tree 后恍然大悟,不用看代码也能知道别人的API 是如何设[详细]
-
使用C#设计Fluent Interface
所属栏目:[大数据] 日期:2021-05-21 热度:134
我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent Interface,这样的API充分利用了VS的智能提示,而且写出来的代码非常整洁。我们如何在代码中也写出这种Fluent的代码呢,我这里介绍3总比较常用的模式,在这些模式上稍加改动[详细]
-
Unit Of Work的设计
所属栏目:[大数据] 日期:2021-05-21 热度:138
在DDD开发过程中,一个良好的Uow设计必不可少,我心目中的Uow设计应该具备以下几点: 1、有着良好的抽象,有着恰如其分的命名; 2、能够应付不同的组件,比如你的系统中可能会存在EfUnitOfWork、RedisUnitOfWork; 3、易于使用,不用开发者显示调用。Uow在一[详细]
-
编写具有单一职责(SRP)的类
所属栏目:[大数据] 日期:2021-05-21 热度:135
这两周我需要对一个历史遗留的功能做一些扩展,正如很多人不愿意碰这些历史遗留的代码一样,我的内心也同样对这样的任务充满反抗。这些代码中充斥着各种null判断(你写的return null正确吗?),不规范的变量命名,层层嵌套的if…else语句。显然面对这样的代[详细]
-
写给.NET开发者的数据库Migration方案
所属栏目:[大数据] 日期:2021-05-21 热度:174
微软给我们提供了一种非常好用的数据库迁移方案,但是我发现周围的同学用的并不多,所以我还是想把这个方案整理一下。.NET选手看过来,特别是还在通过手工执行脚本来迁移数据库的同学们,当然你也可以选择EF的Migration方案和FluentMigrator,但是下面我介绍[详细]
-
你眼中的async/await是什么样的?
所属栏目:[大数据] 日期:2021-05-21 热度:82
又到了周末的code review环节,这次code review发现了一个对async/await的理解问题。让我们直奔主题: var foodsSearch = new FoodSearchService().SearchAsync(); var fruitsSearch = new FruitSearchService().SearchAsync(); var foods = await foodsSear[详细]
-
IDisposable的另类用法
所属栏目:[大数据] 日期:2021-05-21 热度:176
IDisposable是.Net中一个很重要的接口,一般用来释放非托管资源,我们知道在使用了IDisposable的对象之后一定要调用IDisposable.Dispose()方法,或者使用.Net提供的关键字using来达到这一目的,如: public void ReadFile() { using (var reader=new StreamR[详细]
-
使用OAuth打造webapi认证服务供自己的客户端使用(二)
所属栏目:[大数据] 日期:2021-05-21 热度:117
在上一篇”使用OAuth打造webapi认证服务供自己的客户端使用“的文章中我们实现了一个采用了OAuth流程3-密码模式(resource owner password credentials)的WebApi服务端。今天我们来实现一个js+html版本的客户端。 一、angular客户端 angular版本的客户端代[详细]
-
ASP.NET Core 1.0中的管道-中间件模式
所属栏目:[大数据] 日期:2021-05-21 热度:71
ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline)。日志记录、用户认证、MVC等模块都以中间件(Middleware)的方式注册在管道中。显而易见这样的设计非常松耦合并且非常灵活,你可以自己定义任意功能的Middleware注册在管道中。这一设计非常适用于“请求[详细]
-
使用Domain-Driven创建Hypermedia API
所属栏目:[大数据] 日期:2021-05-21 热度:95
使用Domain-Driven创建Hypermedia API 在现实世界中我们会遇到各种各样的复杂场景,没有一种API设计方式可以应对所有的场景。区别于”Consumer-Driven Contract”,本文将描述另外一种设计API的方式:Domain-Driven API。这不是API设计的标准方法,但是也许[详细]
-
DIP原则、IoC以及DI
所属栏目:[大数据] 日期:2021-05-21 热度:156
一、DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为: "依赖于抽象” 。 该规则告诉我们,程序中所有的依赖关系都应该终止于 抽象类[详细]
-
尾递归
所属栏目:[大数据] 日期:2021-05-21 热度:105
通过阶乘计算来认识尾递归。阶乘可以用下面的表达式来描述: n!=n*(n-1)*(n-2)…3*2*1 根据上面的表达式我们可以概括出下面的算法来计算阶乘: n!=n*(n-1)! public int Factorial(int number) { if (number == 1) { return 1; } var temp = number * Factori[详细]