"微软企业库5.0学习教程:使用PolicyInjection模块进行面向切面编程(AOP),重点讲解如何创建自定义CallHandler以记录用户操作日志。"
在微软企业库5.0中,PolicyInjection模块是实现面向切面编程(AOP)的关键组件,它允许我们在不修改源代码的情况下,向现有应用程序中插入额外的行为,例如日志记录、事务管理等。本教程的第九部分,我们将深入探讨如何创建自定义CallHandler,以满足特定需求,如记录用户操作日志。
CallHandler是PolicyInjection模块的核心,它定义了一个处理程序链,这些处理程序可以在方法调用之前或之后执行自定义逻辑。自定义CallHandler需要实现`ICallHandler`接口,该接口包含两个关键部分:`Invoke`方法和`Order`属性。`Invoke`方法用于插入业务逻辑,`Order`属性则决定了处理程序在链中的执行顺序。
1. **建立自定义CallHandler**
- **通过Attribute方式**:创建一个特性类,继承自`CallHandlerBehaviorAttribute`,并实现所需的功能。这样,你可以通过在目标方法上应用这个特性来触发CallHandler的行为。
- **通过Configuration方式**:创建一个类,实现`ConfigurationElementType(typeof(CustomCallHandlerData))`,并配置在Enterprise Library配置工具中。这种方式允许你在不改变代码的情况下调整CallHandler的行为。
2. **核心代码示例**
举例来说,创建一个名为`UserLogCallHandler`的类,实现`ICallHandler`接口。`Invoke`方法接收两个参数:`IInvocationInput input`和`icontinuation getNext`。`input`对象包含了被拦截方法的所有信息,而`getNext`是一个委托,用于继续调用原始方法。通过`getNext()(input, getNext);`可以调用被拦截的方法,并在调用前后插入自定义逻辑。
在这个例子中,记录用户操作日志需要获取如下信息:
- **操作人**:可以通过检查应用程序上下文(如Cookie)来获取当前用户信息。
- **操作数据**:这可能需要分析`input`对象以确定方法的参数和返回值。
- **操作描述**:根据方法名和业务逻辑来构建描述。
一旦收集到这些信息,你可以在`Invoke`方法中编写逻辑,将它们保存到数据库中的用户操作日志表。
3. **实现过程**
- 创建用户操作日志表,设计包含操作人、操作时间、操作数据和描述等字段。
- 实现`UserLogCallHandler.Invoke`方法,从中提取所需信息,并在数据库中记录操作日志。
- 如果使用Attribute方式,你需要在需要记录操作日志的方法上应用这个自定义特性。
- 如果使用Configuration方式,你需要在Enterprise Library配置中添加和配置自定义CallHandler。
通过以上步骤,你可以利用PolicyInjection模块的自定义CallHandler功能,轻松地为应用程序添加用户操作日志记录。这种面向切面编程的实践,不仅提高了代码的可维护性,也使得业务逻辑更加清晰,减少了重复的记录日志代码。在实际开发中,可以根据项目的具体需求进行适当的调整和扩展,比如添加异常处理、性能跟踪等功能。