Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架

基于Enterprise Library PIAB的AOP框架已经在公司项目开发中得到广泛的使用,但是最近同事维护一个老的项目,使用到了Enterprise Library 2,所以PIAB是在Enterprise Library 3.0中推出的,所以不同直接使用。为了解决这个问题,我写了一个通过方法劫持(Method Interception)的原理,写了一个简易版的AOP框架。(如果对PIAB不是很了解的读者,可以参阅我的文章MS Enterprise Library Policy Injection Application Block 深入解析[总结篇])。

一、如何使用?

编程方式和PIAB基本上是一样的,根据具体的需求创建 相应的CallHandler,通过Custom Attribute的形式将CallHandler应用到类型或者方法上面。下面就是一个简单例子。

namespace Artech.SimpleAopFramework
{
  class Program
  {
    static void Main (string[] args)
    {
      string userID = Guid.NewGuid().ToString();
       InstanceBuilder.Create<UserManager, IUserManager>().CreateDuplicateUsers(userID, Guid.NewGuid().ToString());
       Console.WriteLine("Is the user whose ID is \"{0}\" has been successfully created! {1}", userID, UserUtility.UserExists(userID)?"Yes":"No");
    }
  }
  public class UserManager : IUserManager
  {
    [TransactionScopeCallHandler(Ordinal = 1)]
    [ExceptionCallHandler(Ordinal = 2, MessageTemplate = "Encounter error:\nMessage:{Message}")]
    public void CreateDuplicateUsers(string userID, string userName)
    {
      UserUtility.CreateUser(userID, userName);
       UserUtility.CreateUser(userID, userName);
    }
  }
  public interface IUserManager
  {
     void CreateDuplicateUsers(string userID, string userName);
  }
}

在上面例子中,我创建了两个 CallHandler:TransactionScopeCallHandler和ExceptionCallHandler,用于进行事务和异常的处理。也就是说,我们不需要手工地进行事务 的Open、Commit和Rollback的操作,也不需要通过try/catch block进行手工的异常处理。为了验证正确性,我模拟了这样的场景:数据库中有 一个用户表(Users)用于存储用户帐户,每个帐户具有唯一ID,现在我通过UserManager的CreateDuplicateUsers方法插入两个具有相同ID的 记录,毫无疑问,如果没有事务的处理,第一次用户添加将会成功,第二次将会失败。反之如果我们添加的TransactionScopeCallHandler能够 起作用,两次操作将在同一个事务中进行,重复的记录添加将会导致怎过事务的回退。

在ExceptionCallHandler中,会对抛出的 SqlException进行处理,在这我们仅仅是打印出异常相关的信息。至于具有要输出那些信息,可以通过ExceptionCallHandlerAttribute的 MessageTemplate 属性定义一个输出的模板。

运行程序,我们会得到这样的结果,充分证明了事务的存在,错误信息也按照我们希望的 模板进行输出。

时间: 2024-09-15 09:30:01

Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架的相关文章

Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式

最近负责一个框架性项目的升级,主要是从.NET Framework 3.0建议到.NET .NET Framework 3.5,开发工具也从VS2005迁移到VS2008.但是最让我头疼的是,原来Team Foundation Server 2005不能正常工作,公司暂时还没有购买VSTS 2008的打算.基于TFS 2005的Team Build功能不能使用了,导致原本通过Team Build实现的功能需要手工来做,涉及到的包括:Source Code的编译.文档的生成.VS项目类型的模板的创

Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步

对于一个真正的企业级的应用来说,Caching肯定是一个不得不考虑的因素,合理.有效地利用Caching对于增强应用的Performance(减少对基于Persistent storage的IO操作).Scalability(将数据进行缓存,减轻了对Database等资源的压力)和Availability(将数据进行缓存,可以应对一定时间内的网络问题.Web Service不可访问问题.Database的崩溃问题等等).Enterprise Library的Caching Application

Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成

Enterprise Library是微软P&P部门开发的众多Open source框架中的一个,最新的版本已经出到了4.0.由于接触Enterprise Library已经有很长的一段时间,在实际的项目中使用的频率也很高.对此有了一些积累,希望通过这个新的系列和广大网友一起分享和交流.本系列假设读者已经对Enterprise Library有一定的了解,故而不会对各个Application Block的基本原理和编程模型进行介绍,而把侧重点放在Enterprise Library深层次的实现原

《Enterprise Library深入解析与灵活应用》博文系列汇总

Enterprise Library是微软P&P部门开发的众多Open source框架中的一个,最新的版本已经出到了4.1.由于接触Enterprise Library已经有很长的一段时间,在实际的项目中使用的频率也很高.对此有了一些积累,希望通过这个新的系列和广大网友一起分享和交流.本系列假设读者已经对Enterprise Library有一定的了解,故而不会对各个Application Block的基本原理和编程模型进行介绍,而把侧重点放在Enterprise Library深层次的实现原

Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于Caching

Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug 微软EnterLib的Policy Injection Application Block(PIAB)是一个比较好用的轻量级的AOP框架,你可以通过创建自定义的CallHandler 实现某些CrossCutting的逻辑,并以自定义特性或者配置的方式应用到目标方法上面.PIAB自身也提供了一系列的CallHandler,其中 CachingCallHandler直接

Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBl

Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下] 在上篇中,我详细介绍了如何通过自定义ClientMessageInspector和 ErrorHandler,实现WCF与微软企业库中的Exception Handling Application Block(EHAB)之间的集成.这个方案的基本思路就是:当异常从服务端抛出,利 用EHAB针对某个配置好的异常处理策略进行处理:然后将处理有的异常通过 Servic

Enterprise Library深入解析与灵活应用(8):通过WCF扩展实现与EHAB的集成[

Enterprise Library深入解析与灵活应用(8):通过WCF扩展实现与EHAB的集成[上篇] 在<WCF技术剖析(卷1)>的最后一章,我给出了一个具体的应用WCF的分布式应用实例,我把这个实例命名为PetShop.在这个例子中,我利用WCF的扩展实 现了一些设计.架构模式,比如AOP.IoC等.看过本书的读者,一定还记得我还 通过WCF扩展实现了于微软企业库(Enterprise Library)异常处理应用块 (Exception Handling Application Blo

Enterprise Library深入解析与灵活应用(4):创建一个自定义Exception Handl

Enterprise Library深入解析与灵活应用(4):创建一个自定义Exception Handler改变ELAB的异常处理机制 1.背景与动机 微软Enterprise Library ELAB(Exception Handling Application Block)提供了一种基于策略(Policy)的异常 处理方式,在不同的环境中,比如多层架构中不同的层次中,我们可以定义不同的异常处理策略.对于ELAB来说,Exception Handling Policy = Exception

Enterprise Library深入解析与灵活应用(3):倘若将Unity、PIAB、Exception Ha

Enterprise Library深入解析与灵活应用(3):倘若将Unity.PIAB.Exception Handling引入MVP模式 最近在做一个Smart Client Software Factory的项目.熟悉SCSF或者CAB的都应该很清楚MVP这种设计模式.MVP是MVC的一种变体,View和 Mode分别关注于UI的呈现和业务模型,View和Mode完全分离,View通过Presenter实现对业务模型的访问,Presenter"间接"地调 用View实现对UI的操