zoukankan      html  css  js  c++  java
  • .NET下集中实现AOP编程的框架

    一、Castle

    使用这个框架呢,首先是需要安装NuGet包。

    先建立一个控制台项目,然后在NuGet中搜索Castle.Windsor,不出意外的话应该能找到如下的包

    然后安装,会自动的安装包Castle.Core

    创建一个类CastleWindsor,实现接口IInterceptor,这个接口呢就在Castle.Core.dll中了

    class CastleWindsor : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                PreProceed(invocation);
                Console.WriteLine("ffff");
                invocation.Proceed();
                PostProceed(invocation);
    
            }
            public void PreProceed(IInvocation invocation) { Console.WriteLine("方法执行前"); }
            public void PostProceed(IInvocation invocation) { Console.WriteLine("方法执行后"); }
    
        }

    类中的Intercept函数来自于接口IInterceptor。而函数IInterceptor和PostProceed并不是必须的,可以没有这两个函数,主要还是看Intercept函数中的invocation.Proceed();这一句。在这一句之前添加的代码肯定先于修饰的函数执行,在这之后的代码,晚于

    修饰的函数执行。

    然后定义服务端,就是完成业务功能的代码段。

      public interface IUserProcessor {
            void RegUser(string txt);
            void WriteMessage(string msg);
        }
        public class UserProcessor : IUserProcessor {
            public virtual void RegUser(string txt) {
                Console.WriteLine("用户已注册。Name:{0}", txt);
            }
    
            public virtual void WriteMessage(string msg)
            {
                Console.WriteLine(msg);
            }
        }

    假设的是这个接口和类就是为了完成业务功能的地方。

    然后创建客户端来调用服务端:

    
    

    class CoreBusiness
    {

      public void Work_5()

            {
                try {
                    Castle.DynamicProxy.ProxyGenerator generator = new Castle.DynamicProxy.ProxyGenerator();
                    CastleWindsor interceptor = new CastleWindsor();
                    IUserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor);               
                   
                    userprocessor.WriteMessage("555555555555");
                    userprocessor.RegUser("123123123123");
                }
                catch (Exception ex)
                { throw ex; }
            }
    }

    注意看这个客户端的代码,这里有一个UserProcessor的对象userprocessor,但是却没有通过new关键字来创建,而是通过ProxyGenerator的CreateClassProxy函数来创建,从而将CastleWindsor类和UserProcessor类联系起来了。

    在main函数中调用Work_5,执行结果:

    从执行结果中可以看出来,每次调用服务端的函数,都会执行Intercept函数。

    这个框架来实现AOP的话,如果是项目开发中就应用了这个框架还好,否则在开发完成后才来引入这个框架,那么势必要对原来的代码进行大量的修改。这一点上还不如筛选器和postsharp框架。

     当然这个框架也可以在函数执行前获取函数的参数值,在函数执行后,能获取函数的返回值。要注意的是,不能获取到函数的参数名

     通过以下方式来获取参数值和返回值

     

    invocation.Method.Name:函数名

    invocation.Arguments:参数值的数组。invocation.Arguments的类型是object[]

    invocation.ReturnValue:函数返回值,注意这个必须是在invocation.Proceed()执行之后且函数有返回值的情况下才有值。类型是object

    看看Intercept函数的参数类型。注意标红线的地方。ReturnValue不是只读的,那就是说可以在函数执行完成后,去修改函数的返回值。SetArgumentValue表示可以在函数执行前,去修改函数的参数。

     

  • 相关阅读:
    oracle常用hint的用法
    浅谈reverse函数与django哲学
    javascript console
    python os.path模块
    删除列表元素
    Python模块学习 pickle, cPickle 对象序列化/反序列化
    Python中zip()函数用法举例
    Python 字符串方法详解
    常用正则验证
    python中下划线的用法
  • 原文地址:https://www.cnblogs.com/jin-/p/9715820.html
Copyright © 2011-2022 走看看