- 浏览: 84703 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
原帖地址:http://www.cnblogs.com/happyframework/archive/2013/06/06/3120410.html
背景
某位大牛说过,采用命名模式的好处是,你可以将命令按照不同的方式执行,如:排队、异步、远程和拦截等等。今天我介绍一下如何拦截命令的执行,这有些AOP的味道。
思路
就是一个管道过滤器而已
实现
核心代码
命令接口
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Happy.Command
8 {
9 /// <summary>
10 /// 命令接口。
11 /// </summary>
12 public interface ICommand
13 {
14 }
15 }
命令处理器接口,一个命令只能有一个命令处理器。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Happy.Command
8 {
9 /// <summary>
10 /// 命令处理器接口,一个命令只能有一个命令处理器。
11 /// </summary>
12 public interface ICommandHandler<TCommand>
13 where TCommand : ICommand
14 {
15 /// <summary>
16 /// 处理命令。
17 /// </summary>
18 void Handle(TCommand command);
19 }
20 }
命令执行上下文接口,代表了一次命令的执行过程。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Happy.Command
8 {
9 /// <summary>
10 /// 命令执行上下文接口,代表了一次命令的执行过程。
11 /// </summary>
12 public interface ICommandExecuteContext
13 {
14 /// <summary>
15 /// 命令执行服务。
16 /// </summary>
17 ICommandService CommandService { get; }
18
19 /// <summary>
20 /// 正在执行的命令。
21 /// </summary>
22 ICommand Command { get; }
23
24 /// <summary>
25 /// 执行下一个<see cref="CommandInterceptorAttribute"/>,如果已经是最后一个,就会执行<see cref="ICommandHandler{TCommand}"/>。
26 /// </summary>
27 void ExecuteNext();
28 }
29 }
命令拦截器,拦截正在被执行的命令。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Happy.Command
{
/// <summary>
/// 命令拦截器,拦截正在被执行的命令。
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public abstract class CommandInterceptorAttribute : Attribute
{
/// <summary>
/// 构造方法。
/// </summary>
/// <param name="order">指示拦截器在管道中的位置</param>
protected CommandInterceptorAttribute(int order)
{
this.Order = order;
}
/// <summary>
/// 拦截正在被执行的命令。
/// </summary>
/// <param name="context">命令执行上下文</param>
public abstract void Intercept(ICommandExecuteContext context);
/// <summary>
/// 拦截器在管道中的位置。
/// </summary>
public int Order { get; protected set; }
}
}
管道过滤器的内部实现
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Happy.Command.Internal
8 {
9 internal sealed class CommandInterceptorChain
10 {
11 private ICommandExecuteContext _commandExecuteContext;
12 private CommandInterceptorAttribute[] _commandInterceptors;
13 private Action _commandExecutor;
14 private int _currentCommandInterceptorIndex = -1;
15
16 internal CommandInterceptorChain(
17 ICommandExecuteContext commandExecuteContext,
18 CommandInterceptorAttribute[] commandInterceptors,
19 Action commandExecutor)
20 {
21 _commandExecuteContext = commandExecuteContext;
22 _commandInterceptors = commandInterceptors.OrderBy(x => x.Order).ToArray();
23 _commandExecutor = commandExecutor;
24 }
25
26 private CommandInterceptorAttribute CurrentCommandInterceptor
27 {
28 get
29 {
30 return _commandInterceptors[_currentCommandInterceptorIndex];
31 }
32 }
33
34 internal void ExecuteNext()
35 {
36 _currentCommandInterceptorIndex++;
37
38 if (_currentCommandInterceptorIndex < _commandInterceptors.Length)
39 {
40 this.CurrentCommandInterceptor.Intercept(_commandExecuteContext );
41 }
42 else
43 {
44 _commandExecutor();
45 }
46 }
47 }
48 }
事务拦截器
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Transactions;
7
8 namespace Happy.Command
9 {
10 /// <summary>
11 /// 事务拦截器。
12 /// </summary>
13 public sealed class TransactionAttribute : CommandInterceptorAttribute
14 {
15 /// <inheritdoc />
16 public TransactionAttribute(int order) : base(order) { }
17
18 /// <inheritdoc />
19 public override void Intercept(ICommandExecuteContext context)
20 {
21 using (var ts = new TransactionScope())
22 {
23 context.ExecuteNext();
24
25 ts.Complete();
26 }
27 }
28 }
29 }
应用事务拦截器
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 using Happy.Domain;
8 using Happy.Command;
9 using Happy.DesignByContract;
10
11 namespace Happy.Application
12 {
13 /// <summary>
14 /// 简单的创建命令。
15 /// </summary>
16 [Transaction(1)]
17 public abstract class SimpleCreateCommand<TAggregateRoot> : SimpleCommand<TAggregateRoot>
18 where TAggregateRoot : AggregateRoot
19 {
20 }
21 }
执行命令
1 /// <summary>
2 /// 创建。
3 /// </summary>
4 public ActionResult Create(TAggregateRoot item)
5 {
6 this.CurrentCommandService.Execute(new TCreateCommand
7 {
8 Aggregate = item
9 });
10
11 return this.NewtonsoftJson(new
12 {
13 success = true,
14 items = this.GetById(item.Id)
15 });
16 }
备注
这里的命令模式本质上是一种消息模式,因为命令里没有任何行为,将行为独立了出来。像WCF、ASP.NET和ASP.NET MVC本质上也是消息模式,他们也内置了管道过滤器模式。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1077原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1139原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 627原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 477原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 601原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 564原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 562原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 527原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 499原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 806原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 791原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 625原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 571原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 614原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 842原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 960原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 414原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 678原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 677原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 505原帖地址:http://www.cnblogs.com/had ...
相关推荐
15. **命令模式(Command)**:命令模式在Spring AOP中可能并不直接体现,但在Spring MVC中,控制器方法可以看作命令对象,负责处理请求。 16. **状态模式(State)**:状态模式在Spring AOP中不是直接应用,但可以...
在Java中,许多库和框架都使用了命令模式,例如Swing中的ActionListener接口,以及Spring框架的AOP(面向切面编程)中的通知模型。 总结一下,命令模式提供了一种方式来将请求封装为独立的对象,使得请求的发送者和...
4. **错误排查**:在遇到AOP代码问题时,需要熟悉调试技巧,例如设置断点、查看日志输出、使用AspectJ的debug模式等,来定位错误发生的具体位置和原因。 5. **Gradle集成**:由于文件列表中有`build.gradle`,说明...
本篇文章将详细讲解如何利用Redis、Lua脚本以及AOP(面向切面编程)来实现一个简单的限流策略。Redis是一个高性能的键值存储系统,而Lua则可以作为其内置的脚本语言执行复杂逻辑,AOP则是编程设计模式的一种,允许...
4. **行为型模式**:包括策略模式、模板方法模式、观察者模式、迭代器模式、职责链模式、命令模式、备忘录模式、状态模式、访问者模式和解释器模式,它们主要处理对象之间的交互和责任分配。 5. **Java语言特性与...
3. **Spring缓存抽象(Caching Abstract)**:使用AOP实现缓存功能,提高应用程序性能。 4. **Spring本地调度(Scheduling)**:利用AOP处理定时任务。 理解并掌握Spring AOP对于开发高效的Spring应用程序至关重要...
比如命令模式、解释器模式、迭代器模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。C#的事件和委托系统使得实现如观察者模式变得非常直观。 在C#设计模式(第二版)中,作者可能会...
10. **命令模式**:命令模式将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销操作。在GUI编程中,命令模式常用于实现撤销/重做功能。 这些设计模式的掌握对于提升Java开发者的技能和编写高质量、...
如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...
14. 命令模式(Command):命令模式将请求封装为一个对象,以便使用不同的请求、队列请求、支持撤销操作。Java的`java.lang.Runnable`接口以及Swing的Action类都是命令模式的体现。 15. 责任链模式(Chain of ...
3. 行为型模式(Behavioral Patterns):如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、责任链模式(Chain of Responsibility)、命令模式(Command...
结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式)以及行为型模式(如策略模式、模板方法模式、观察者模式、访问者模式、职责链模式、命令模式、解释器模式、迭代器模式、...
命令模式(Command),将请求封装为一个对象;迭代器模式(Iterator)用于顺序访问聚合对象的元素;模板方法模式(Template Method)定义操作中的算法骨架,而将一些步骤延迟到子类中;还有职责链模式(Chain of ...
AOP(面向切面编程)使用代理模式实现;事件驱动机制则基于观察者模式等。 在"23种设计模式_手写代码实现「纯手工代码」"的压缩包文件中,可能包含了使用SpringBoot框架实现这23种设计模式的示例代码。通过学习这些...
最后,行为型模式涉及对象之间的责任分配和交互,如策略模式、模板方法模式、观察者模式、职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、状态模式、访问者模式和访问者模式。 在...
主要包括策略模式、模板方法模式、观察者模式、迭代器模式、访问者模式、职责链模式、命令模式、解释器模式和备忘录模式。 二、设计模式的应用价值 1. 提高代码可读性和可维护性:设计模式为常见的问题提供了标准...
在Java开发领域,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志、事务管理、性能监控等。Spring框架是实现AOP的一个流行选择,它...
4. **行为型模式编程**:行为型模式主要关注对象间的通信和责任分配,包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、访问者模式(Visitor)、命令模式(Command)、迭代器...
- 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或记录请求。 - 解释器模式(Interpreter):提供一种方式来表示语言的语法,并解释执行。 - 迭代器模式(Iterator):提供一种方法...
包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、备忘录模式(Memento)、状态模式(State)、访问者模式(Visitor)、责任链...