转载

AOP编程之静态代理

静态代理

也称为AOP编程 ,而向切面的编译 (Aspect orient programming).

主要是把一些和业务无关的代码,如调用日志,发送邮件 等做为一个业务代码的切面 。

一般是在不改变原有代码的基础上,增加增加增加,和相应的实现代码。在实现代码里增加切面的代码如,如调用日志,然后再调用原业务类的方法 ,等价于对原先业务代码的扩展 。

静态代理。

编译时代理,编译的时候已经存在。 需要手写代码实现 。 

如下 ,对add 方法增加调用前后的日志 , 增加一个新类调用原有的add方法 ,然后把日志进行相应的输出。 

是设计模式中的代理模式应用 。也叫静态代理。

class Program

{

static void Main(string[] args)
  {
       //new A().add();
       new A2().add();
       Console.ReadKey();
  }

}

class A

{

public void add()
  {
       Console.WriteLine("add method");
  }

}

class A2

{

public void add()
  {
       Console.WriteLine("before a ivnoke");
       new A().add();
       Console.WriteLine("after a invoke");
  }

}

也可以通过override来实现 。主要是对基类方法进行重写,增加相应的日志。

class Program

{

static void Main(string[] args)
  {
       //new A().add();
       new A2().add();
       Console.ReadKey();
  }

}

class A

{

public virtual void add()
  {
       Console.WriteLine("add method");
  }

}

class A2:A

{

public override  void add()
  {
       Console.WriteLine("before a ivnoke");
       base.add();
       Console.WriteLine("after a invoke");
  }

}

通过反射来调用

class Program

{

static void Main(string[] args)
  {
       //new A().add();
       new A2().add();
       Console.ReadKey();
  }

}

class A

{

public void add()
  {
       Console.WriteLine("add method");
  }

}

class A2

{

public void add()
  {
       Console.WriteLine("before");
       A obj =(A)Activator.CreateInstance(typeof(A));
       obj.add();
       Console.WriteLine("after");
  }

}

反射2 ,要调用的类,在另一个类库中, 必须 通过reflection.Assembly.LoadFrom方法来加载类。通过type找到对应的在方法名,然后通过invoke来调用

class Program

{

static void Main(string[] args)
  {
       //new A().add();
       new A2().add();
       Console.ReadKey();
  }

}

class A2

{

public void add()
  {
       Console.WriteLine("before");
       var assem=System.Reflection.Assembly.LoadFrom(".//A.dll");
       var types = assem.GetTypes();
       foreach (var type in types)
      {
           var fund = type.GetMethod("add");
           fund.Invoke(null,null);
      }
     
       Console.WriteLine("after");
  }

}

//新建一个类库,命名为a

namespace A

{

public class A

{

public static  void add()
  {
       Console.WriteLine("add method");
  }

}

}

原文  http://www.hechunbo.com/index.php/archives/209.html
正文到此结束
Loading...