在计算机程序中, 规格模式是一种特殊的软件设计模式,业务规则可以使用布尔逻辑组成规则连而重新组合, 这种模式通常在领域驱动设计中使用。 规格模式描述的是一个业务规则可以和另外的业务规则聚合, 在这种模式中, 业务逻辑单元继承自可聚合的抽象规格基类类,该基类有一个返回布尔值的方法 IsSatisfiedBy 。 在初始化之后, 规格可以和其它规格进行逻辑组合, 使新的规格很容易维护, 实现高度自定义的业务逻辑。 规格模式的 UML 图如下: 实现代码如下: public interface ISpecification<TTarget> { bool Is... 阅读全文

分享一个自己写的 OWIN 静态文件处理中间件, 功能如下: 支持标准的 OWIN 环境, 跨平台运行 (.Net, Mono) 为 OWIN 环境开发, 只依赖 Owin.dll , 和具体的 OWIN 宿主无关, 可以在 .Net 和 Mono 环境下运行; 支持实体标签 (HTTP ETag) 实体标签 是HTTP协议提供的若干机制中的一种Web缓存验证机制,并且允许客户端进行缓存协商。这就使得缓存变得更加高效,而且节省带宽。(参考维基百科) 支持 Html5 路径模式 支持 AngularJS... 阅读全文

升级到 VS2015 之后, TypeScript 文件不能自动编译成 js 文件, 要编译项目才能讲所有的 ts 文件 编译成 js 文件, 不过 VS2015 支持 Gulp , 而 Gulp 有 TypeScript 插件, 这样使用 Gulp 自动编译 ts 文件的方法就可以实现了。 假设项目结构如下: 我们要把 app 目录下的 ts 文件编译到 wwwroot/app 目录下, 使用 Gulp 的做法是这样的: 1、 添加 gulp 和 gulp-typescript NPM 包 打开 package.json , 在 devDependencies 节点下添加:... 阅读全文

在 OWIN 的设计当中, 一切都是松散耦合的, 基于职责链的中间件处理模式给开发者提供了很大的自由, 基于 OWIN 的应用甚至可以脱离 Windows/IIS , 运行在 Linux/Mono 之上。 Microsoft.Owin 中奇葩的设计 不过今天要吐槽的是 Microsoft.Owin 的设计, 在传统的 System.Web 命名空间下, 有一个很庞大的 HttpContext 对象, 让开发者又爱又恨, 它位于 System.Web.dll 之中, 紧密依赖与 Windows/IIS , 而且无所不包, 在 Windows/IIS 上完美运行, 然而也正是因为它紧密依... 阅读全文

AngularJS 中使用 ng-repeat 显示列表数据应该都不陌生了, 用起来很简单, 也很方便, 比如要显示一个产品表格, Controller 的 Javascript 代码如下: angular.module('app', []) .controller('MyController', MyController); MyController.$inject = ['$scope']; function MyController($scope) { // 要显示的产品列表数据; $scope.products = [ { ... 阅读全文

在 AngularJS 的多视图应用中, 一般都有实现登录认证的需求, 最简单的解决方法是结合服务端认证, 做一个单独的登录页面, 登录完成之后再跳转回来, 这种方法当然可取, 不过就破坏了单页面应用 (SPA) 的体验, 追求完美的开发者肯定不会采用这种方法。 在 AngularJS 应用中, 都有一个唯一的变量 $rootScope 当切换视图时, $rootScope 会广播事件 $routeChangeStart , 只要在这个事件的处理函数中检查下一个路由是否允许匿名访问, 如果不允许匿名访问并且没有用户信息的话, 则重定向到登录页面, 思路很简单, 具体实现代码如下: a... 阅读全文

使用 Microsoft.Owin.Security 中间件作为 OWIN 应用的标准验证在 IIS 下面工作良好, 不过最近在将 WebAPI 应用迁移到 Linux + Mono 的环境时, 发现这个中间件不能运行, 在启动时会抛出下面的异常: 这个异常是说无法加载类型 Microsoft.Owin.Security.DataProtection.DpapiDataProtector , 通过 ILSpy 分析 Microsoft.Owin.Security.dll 发现, Microsoft.Owin.Security.DataProtection.DpapiDataProt... 阅读全文

为了 Web 服务的安全, 通常在服务端也会做数据验证, 不过数据验证的代码确实是有点儿枯燥, 以简单的用户注册来说, 需要的注册信息如下: public class RegisterModel { public string Username { get; set; } public string Password { get; set; } public string Confirm { get; set; } } 作为最简单的示例, 只需要提供用户名、 密码、 以及确认密码即可, 验证的要求如下: 用户名必填; 密码必填; 确认... 阅读全文

最近在用 NHibernate 做多对多更新时突然发现 NHibernate 更新的策略很差, 对多对多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪, 现在还原如下: 原来的实体类关系如下: public class User { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual ICollection<Role> Roles { get; set; } public User() { ... 阅读全文

初学 AngularJS 时, 肯定会对其提供 factory 、 service 和 provider 感到疑惑, 这三种都是提供服务的方式, 他们到底有什么区别呢? factory factory 可以认为是设计模式中的工厂方法, 就是你提供一个方法, 该方法返回一个对象的实例, 对于 AngularJS 的 factory 来说, 就是先定义一个对象, 给这个对象添加属性和方法, 然后返回这个对象, 例如: var app = angular.module('MyApp', []); app.factory('MyFactory', function() { // ... 阅读全文

ASP.NET Web API 是 .NET 平台创建 REST 风格的 HTTP 服务的理想框架, REST 风格的 HTTP 服务可以被多种客户端使用, 包括浏览器和移动设备, 使用 REST 风格的 HTTP 服务也越来越多。 由于 REST 服务的逐渐流行, 越来越多的客户端类库都提供了 REST 服务的专用类库, AngularJS 也不例外, 提供了 $resource 来实现 REST 服务的支持。 在 AngularJS 的文档中, 对 $resource 的描述如下: A factory which creates a resource object tha... 阅读全文

ASP.NET Mvc vNext 改名为 ASP.NET 5 , 看来距离正式发布已经不远了, 在发布之初就号称可以跨平台运行, 在发布的早期 alpha 版本中, 做个一次在 mono 下尝试 ASP.NET vNext的试验, 虽然最终以失败告终, 但是在试验的过程中还是还是收获良多, 对 OWIN 有了更深一步的认识, 也熟悉了 OWIN 的第三方实现 Nowin 。 现在最新发布的 ASP.NET 5 版本为 Beta 2, 不仅功能更加完善, 第三方资料也多了很多, 不过完全依靠微软提供的资源还不能在非 Windows 平台运行, ASP.NET 5 可以在 OWIN 环境... 阅读全文

本博客基于 Tabler CSS 框架, 采用 Jekyll 模板引擎, 使用 Markdown 语法编写。

博客源代码及文章内容采用 AS-IS 协议发布,转载时请 AS-IS 。