Enterprise Library

本文介绍了PolicyInjection模块在企业库3.0中的应用,通过示例展示了如何使用此模块实现方法执行前后的日志记录功能。文章包括配置PolicyInjector、创建业务类及自定义CallHandler等内容。

基于Enterprise Library6.0版本

模块介绍

PolicyInjection

PolicyInjection模块是在企业库3.0才正式引入的模块,简称PIAB(Policy Injection Application Block),这个模块的主要功能是方便我们在项目开发中进行AOP(面向切面编程),以简化开发内容。

PolicyInjection模块

简单示例

演示利用PolicyInjection模块在方法执行前和后打印调用日志

主方法

 IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
 PolicyInjector policyInjector = new PolicyInjector(configurationSource);
 PolicyInjection.SetPolicyInjector(policyInjector);
 Operation o = policyInjector.Create<Operation>();
 o.Run();
 Console.Read();

业务类

业务类必须继承自MarshalByRefObject。

 public class Operation : MarshalByRefObject
    {
        [LogHandler]
        public void Run()
        {
            Console.WriteLine("执行了方法1");
        }
    }

自定义CallHandler

  public class LogHandler : ICallHandler
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            Console.WriteLine("方法前执行");
            IMethodReturn result = getNext().Invoke(input, getNext);
            Console.WriteLine("方法后执行");
            return result;
        }
        public int Order
        {
            get;
            set;
        }
    }

自定义LogHandlerAttribute

对方法拦截有两种方式,Attribute拦截,Configuration拦截.示例采用第一种方式.
定义后,只要在方法上标明该Attribute则会调用响应的LogHandler.

public class LogHandlerAttribute : HandlerAttribute
{
    public override ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container)
    {
        return new LogHandler();
    }
}

ICallHandler

Invoke方法

invoke方法用于对具体拦截方法做相应的处理

 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)

Order

多个Handler调用的先后顺序

private int _order = 0;
public int Order
{
        get
        {
            return _order;
        }
        set
        {
            _order = value;
        }
}

调用具体方法

var result = getNext()(input, getNext);

input

这个参数中封装了已拦截的方法、方法的参数等有用的信息
inputs 传入的参数值和参数类型。
InvocationContext
MethodBase 注入的方法
Target 注入的类

getNext

一个委托,用于调用拦截的方法,通过这个委托我们可以很好的控制我们需要在拦截了具体方法后如何进行具体的业务逻辑操作。

IMethodReturn

调用后的返回值
Exception 调用中的异常
InvocationContext
Outputs 输出参数
ReturnValue 返回值

抛出异常

if(result.Excepiton!=null)
{
    return input.CreateExceptionMethodReturn(new Exception("Permission Denied")); 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值