亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

關于.NET動態代理的介紹和應用簡介

2020-01-18 01:53:47
字體:
來源:轉載
供稿:網友
  引言

  假如現在我們有這樣在這個示例中我將使用盡可能簡單的邏輯實現所有功能需求,這將更突出我們所要解決的核心問題。例子是一個簡單計算器類:

public class Calculator
{
 public int Add(int x, int y) { return x + y; }
}

  這個類再簡單不過了,不過若你將它想象為一個可能更復雜的業務處理類的時候,你將面臨除了核心功能實現之外的更多處理細節,比如說:權限控制、審計日志、性能監測、緩沖處理、事務環境等等。為簡單起見,我們首先為該類增加記錄日志的功能,該功能要求將對每個方法的調用和處理結果輸出到Console中,如下:

public class Calculator
{
 public int Add(int x, int y)
 {
  Console.Write("Add({0},{1})", x, y);
  int result = x + y;
  Console.WriteLine(" = {0}", result);
  return result;
 }
}

  再簡單不過了,對吧?現在我們需要為該方法實現性能監測,如下:

public class Calculator
{
 public int Add(int x, int y)
 {
  Console.Write("Add({0},{1})", x, y);
  DateTime TimeBegin = System.DateTime.Now;
  int result = x + y;
  TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
  Console.Write(" [{0}] ", TimeInter);
  Console.WriteLine(" = {0}", result);
  return result;
 }
}

  此時你已經感覺到,雖然我們實現了所需的功能,但是在一個方法中堆疊了處理各類事宜的不同代碼。雖然在這個簡單例子中不會感覺有什么不爽,但是請你想象一下如果我們將為該類添加第二個方法時會發生什么事情:

public class Calculator
{
 public int Add(int x, int y)
 {
  Console.Write("Add({0},{1})", x, y);
  DateTime TimeBegin = System.DateTime.Now;
  int result = x + y;
  TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
  Console.Write(" [{0}] ", TimeInter);
  Console.WriteLine(" = {0}", result);
  return result;
 }
 public int Subtract(int x, int y)
 {
  Console.Write("Subtract({0},{1})", x, y);
  DateTime TimeBegin = System.DateTime.Now;
  int result = x - y;
  TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
  Console.Write(" [{0}] ", TimeInter);
  Console.WriteLine(" = {0}", result);
  return result;
 }
}

  在兩個方法中已經明顯出現重復代碼了,這可不是一個好的解決辦法――想想一下如果我們的計算器有10個方法呢?如果我們還有類似于計算器類的另外數十個類呢?如果我們還有更多的方法級功能要實現呢(權限控制、事務管理……)?在企業級應用開發中,這可是一個經常會遇的問題。為清楚起見,我們將問題分解成兩部分,首要的問題是代碼職責混淆,其次則是同樣的代碼邏輯反復多次――這些問題都將導致開發管理、代碼編寫與維護的各種困難。

  方案一:自己手動編寫代理解決

  1、首先 我們定義接口ICalculator:

using System;
namespace Proxy
{
 public interface ICalculator
 {
  int Add(int x, int y);
  int Subtract(int x, int y);
 }
}

  2、具體實現一個接口:

using System;
namespace Proxy
{
 public class Calculator:ICalculator
 {
  public virtual int Add(int x, int y)
  {
   int result = x + y;
   return result;
  }
  public virtual int Subtract(int x, int y)
  {
   int result = x - y;
   return result;
  }
 }
}
  3、編寫增加日志和性能檢測功能的代理類

  增加記錄日志的功能,即功能要求將對每個方法的調用和處理結果輸出到Console;增加性能監測。

  有兩種實現方式 ,注釋了其中的一種

using System;
namespace Proxy
{
 // /// <summary>
 // /// CalProxy 的摘要說明。
 // /// </summary>
 // public class CalProxy:ICalculator
 // {
 // private Calculator _Calculator;
 // public CalProxy()
 // {
 // this._Calculator=new Calculator();
 // }
 // private DateTime TimeBegin = System.DateTime.Now;
 // private void PreDoSomething(int x, int y)
 // {
 // TimeBegin = System.DateTime.Now;
 // Console.Write("Number({0},{1})/n", x, y);
 // }
 // //實現add
 // public virtual int Add(int x, int y)
 // {
 // this.PreDoSomething(x,y);
 // int result = this._Calculator.Add(x,y);
 // this.PostDoSomething(result);
 // return result;
 // }
 // //實現sub
 // public virtual int Subtract(int x, int y)
 // {
 // this.PreDoSomething(x,y);
 // int result = this._Calculator.Subtract(x,y);
 // this.PostDoSomething(result);
 // return result;
 // }
 // private void PostDoSomething(int result)
 // {
 // TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
 // Console.Write(" 運行時間[{0}]/n ", TimeInter);
 // Console.WriteLine(" 運行結果= {0}/n", result);
 // }
 // }
 /// <summary>
 /// CalProxy 的摘要說明。
 /// </summary>

 public class CalProxy:Calculator
 {
  public CalProxy()
  {}
  private DateTime TimeBegin = System.DateTime.Now;
  private void PreDoSomething(int x, int y)
  {
   TimeBegin = System.DateTime.Now;
   Console.Write("Number({0},{1})/n", x, y);
  }
  //實現add
  public override int Add(int x, int y)
  {
   this.PreDoSomething(x,y);
   int result = base.Add(x,y);
   this.PostDoSomething(result);
   return result;
  }
  //實現sub
  public override int Subtract(int x, int y)
  {
   this.PreDoSomething(x,y);
   int result = base.Subtract(x,y);
   this.PostDoSomething(result);
   return result;
  }
  private void PostDoSomething(int result)
  {
   TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
   Console.Write(" 運行時間[{0}]/n ", TimeInter);
   Console.WriteLine(" 運行結果= {0}/n", result);
  }
 }
}

  4、外界的調用方式

ICalculator ICal=new Proxy.CalProxy();

ICal.Add(5,3);

ICal.Subtract(7,2);

  運行程序的結果:

Number(5,3)

  運行時間[00:00:02.0156250]

  運行結果= 8

  Number(7,2)

  運行時間[00:00:03]

  運行結果= 5

  方案二:通過使用Castle.DynamicProxy,實現Iinterceptor解決

  步驟1,2與解決問題

  3、實現StandardInterceptor,增加日志和性能監測功能

  StandardInterceptor是接口Iinterceptor的一個實現類,我們實現StandardInterceptor

using System;
using System.Collections;
using Castle.DynamicProxy;

namespace Proxy
{
 /// <summary>
 /// ProxyInterceptor 攔截器 實現了日志和性能監測
 /// </summary>

 public class ProxyInterceptor:StandardInterceptor
 {
  private System.DateTime TimeBegin=System.DateTime.Now;
  public ProxyInterceptor()
  {}
  protected override void PostProceed(IInvocation invocation, ref object returnValue, params object[] arguments)
  {
   TimeSpan TimeInter =System.DateTime.Now-TimeBegin;
   Console.Write(" 運行時間[{0}]/n ", TimeInter);
   Console.WriteLine(" 運行結果= {0}/n", returnValue);
   base.PostProceed(invocation, ref returnValue, arguments);
  }
  protected override void PreProceed(IInvocation invocation, params object[] args)
  {
   Console.Write("Number({0},{1})/n", args[0], args[1]);
   TimeBegin=System.DateTime.Now;
   base.PreProceed(invocation, args);
  }
  public override object Intercept(IInvocation invocation, params object[] args)
  {
   PreProceed(invocation, args);
   object retValue = invocation.Proceed( args );
   PostProceed(invocation, ref retValue, args);
   return retValue;
  }
 }
}

  4、使用Castle.DynamicProxy調用

ProxyGenerator generator = new ProxyGenerator();
object proxy = generator.CreateClassProxy(typeof(Calculator), new ProxyInterceptor());
ICalculator ICalCastle=proxy as ICalculator;
ICalCastle.Add(5,3);
ICalCastle.Subtract(7,2);


  實現過程:首先通過代碼生成完成一個代理類,該代理類繼承自要織入的類。然后在代理類中覆蓋要攔截的方法,并在覆蓋的方法中封裝Invocation對象,并傳給用戶傳入的Intercepter對象的Intercept方法。在Intercept方法依次調用Intercepter的PreProcess,通過Invocation傳入的Delegate指向的回調函數,Intercepter的PostProcess方法,從而達到攔截的目的。

  意義

  在aop領域 可以將日志,事務,緩存等附加功能用此實現。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲欧美中文在线| 一区二区三区视频免费| 亚洲精品美女久久久| 欧美做受高潮1| 国产精品黄视频| 国产一级揄自揄精品视频| 欧美在线视频观看| 亚洲电影成人av99爱色| 国产精品视频自拍| 欧美高跟鞋交xxxxhd| 亚洲精品自产拍| 精品一区二区三区电影| 久久精品这里热有精品| 亚洲欧美制服另类日韩| 亚洲аv电影天堂网| 久久久精品欧美| 亚洲精品福利资源站| 久久天天躁狠狠躁夜夜av| 久久精品国产综合| 91精品国产九九九久久久亚洲| 91最新在线免费观看| 欧美在线日韩在线| 日韩欧美在线网址| 欧美国产日韩中文字幕在线| 国产一区二中文字幕在线看| 国产剧情日韩欧美| 久久久免费精品| 欧美激情精品久久久久久免费印度| 97精品欧美一区二区三区| 亚洲电影免费观看| 亚洲日本中文字幕免费在线不卡| 欧美电影在线免费观看网站| 色久欧美在线视频观看| 日韩高清中文字幕| 热久久这里只有精品| 91精品国产综合久久久久久久久| 色综合久久悠悠| 日韩精品视频在线观看免费| 最新日韩中文字幕| 欧美午夜性色大片在线观看| 亚洲成人999| www.亚洲一二| 日韩午夜在线视频| 亚洲欧美日韩成人| 91产国在线观看动作片喷水| 亚洲欧美日韩图片| 久久综合网hezyo| 91精品久久久久久久久青青| 日韩电影大片中文字幕| 午夜精品在线视频| 亚洲成人久久一区| 国产精品h在线观看| 国产精品自拍偷拍| 福利微拍一区二区| 粗暴蹂躏中文一区二区三区| 久久夜色精品亚洲噜噜国产mv| 亚洲欧美在线x视频| 91欧美激情另类亚洲| 国产精品成人品| 欧美高清性猛交| 久99久在线视频| 久久精品91久久久久久再现| 国产精品久久视频| 国产精品高精视频免费| 欧美一区二区三区精品电影| 欧美一级淫片videoshd| 亚洲精品永久免费精品| 日韩精品欧美激情| 亚洲色图综合久久| 精品国产拍在线观看| 久久精品在线视频| 成人免费视频97| 日韩美女视频中文字幕| 青青草成人在线| 国产日韩在线亚洲字幕中文| 欧美在线一级视频| 久久影院中文字幕| 成人做爰www免费看视频网站| 亚洲经典中文字幕| 久久久久久一区二区三区| 国产成人一区二| 久久大大胆人体| 国产精品久久久久久久7电影| www国产亚洲精品久久网站| 亚洲视频在线观看视频| 久久精视频免费在线久久完整在线看| 久久五月天综合| 欧美精品久久久久久久免费观看| 97在线视频免费播放| 国产精品视频导航| 欧美日韩裸体免费视频| 中文字幕日韩精品有码视频| 亚洲成人性视频| 国产成+人+综合+亚洲欧美丁香花| 亚洲色图15p| 亚洲毛片一区二区| 91av视频在线播放| 最近2019年好看中文字幕视频| 国产精品成人在线| 成人情趣片在线观看免费| 日韩专区在线观看| 欧美电影免费看| 日韩一区av在线| 日韩精品视频中文在线观看| 欧美大片免费观看在线观看网站推荐| 亚洲精品成人久久电影| 国产精品久久久久久网站| 国产成人小视频在线观看| 超碰精品一区二区三区乱码| 亚洲一区二区在线播放| 在线看日韩欧美| 色诱女教师一区二区三区| 欧美精品一区二区三区国产精品| 精品动漫一区二区三区| 亚洲欧美日韩一区二区三区在线| 中文字幕精品国产| 狠狠操狠狠色综合网| 国产激情久久久| 中文字幕日韩电影| 精品久久久久久中文字幕一区奶水| 久久人人爽人人爽人人片av高请| 国产97人人超碰caoprom| 免费91麻豆精品国产自产在线观看| 日韩欧美在线视频观看| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美一区二区三区四区| 久久久久久久一区二区| 日本电影亚洲天堂| 中文字幕欧美国内| 亚洲精品视频播放| 国产精品扒开腿爽爽爽视频| 亚洲成人999| 久久av.com| 久久国产精彩视频| 亚洲第一在线视频| 中文字幕无线精品亚洲乱码一区| 国产又爽又黄的激情精品视频| 久久久久久久久91| 国产精品美女久久久久av超清| 亚洲一区二区三区成人在线视频精品| 蜜臀久久99精品久久久久久宅男| 亚洲大胆人体在线| 成人免费看片视频| 俺去亚洲欧洲欧美日韩| 国产精品专区第二| 欧美激情精品久久久久久大尺度| 91麻豆桃色免费看| 国产精品99久久久久久久久| 日韩av一区二区在线| 国产亚洲视频在线观看| 日韩中文视频免费在线观看| 正在播放欧美视频| 国产精品第一页在线| 青青草99啪国产免费| 91情侣偷在线精品国产| 欧美一区在线直播| 久久久在线观看| 亚洲精品美女久久久| 亚洲成人黄色在线观看| 国产精品av免费在线观看| 亚洲社区在线观看| 欧美另类在线观看| 精品日韩中文字幕| 亚洲永久免费观看|