Welcome

首页 / 软件开发 / .NET编程技术 / Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架

Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架2010-08-18 cnblogs artech基于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: Message:{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 属性定义一个输出的模板。

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