亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于.NET動態(tài)代理的介紹和應(yīng)用簡介

 更新時間:2006年09月28日 00:00:00   作者:  
  引言

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

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

  這個類再簡單不過了,不過若你將它想象為一個可能更復(fù)雜的業(yè)務(wù)處理類的時候,你將面臨除了核心功能實現(xiàn)之外的更多處理細節(jié),比如說:權(quán)限控制、審計日志、性能監(jiān)測、緩沖處理、事務(wù)環(huán)境等等。為簡單起見,我們首先為該類增加記錄日志的功能,該功能要求將對每個方法的調(diào)用和處理結(jié)果輸出到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;
 }
}

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

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;
 }
}

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

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;
 }
}

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

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

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

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

  2、具體實現(xiàn)一個接口:

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、編寫增加日志和性能檢測功能的代理類

  增加記錄日志的功能,即功能要求將對每個方法的調(diào)用和處理結(jié)果輸出到Console;增加性能監(jiān)測。

  有兩種實現(xiàn)方式 ,注釋了其中的一種

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);
 // }
 // //實現(xiàn)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;
 // }
 // //實現(xiàn)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(" 運行結(jié)果= {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);
  }
  //實現(xiàn)add
  public override int Add(int x, int y)
  {
   this.PreDoSomething(x,y);
   int result = base.Add(x,y);
   this.PostDoSomething(result);
   return result;
  }
  //實現(xiàn)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(" 運行結(jié)果= {0}\n", result);
  }
 }
}

  4、外界的調(diào)用方式

ICalculator ICal=new Proxy.CalProxy();

ICal.Add(5,3);

ICal.Subtract(7,2);

  運行程序的結(jié)果:

Number(5,3)

  運行時間[00:00:02.0156250]

  運行結(jié)果= 8

  Number(7,2)

  運行時間[00:00:03]

  運行結(jié)果= 5

  方案二:通過使用Castle.DynamicProxy,實現(xiàn)Iinterceptor解決

  步驟1,2與解決問題

  3、實現(xiàn)StandardInterceptor,增加日志和性能監(jiān)測功能

  StandardInterceptor是接口Iinterceptor的一個實現(xiàn)類,我們實現(xiàn)StandardInterceptor

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

namespace Proxy
{
 /// <summary>
 /// ProxyInterceptor 攔截器 實現(xiàn)了日志和性能監(jiān)測
 /// </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(" 運行結(jié)果= {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調(diào)用

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);


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

  意義

  在aop領(lǐng)域 可以將日志,事務(wù),緩存等附加功能用此實現(xiàn)。

 

相關(guān)文章

  • ASP.NET ASHX中獲得Session的方法

    ASP.NET ASHX中獲得Session的方法

    有時候需要在ASHX中獲取Session,可是一般是獲取不到的,如何解決,下面說一下獲得的方法
    2013-10-10
  • 用戶控件(ASCX)向網(wǎng)頁(ASPX)傳值使用反射實現(xiàn)

    用戶控件(ASCX)向網(wǎng)頁(ASPX)傳值使用反射實現(xiàn)

    用戶控件向網(wǎng)頁傳遞值,網(wǎng)上的方法有很多,本文嘗試一下使用反射來實現(xiàn),感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-03-03
  • asp.net 生成隨機密碼的具體代碼

    asp.net 生成隨機密碼的具體代碼

    這篇文章介紹了asp.net 生成隨機密碼的具體代碼,有需要的朋友可以參考一下
    2013-09-09
  • 教你Asp.net下使用mysql數(shù)據(jù)庫的步驟

    教你Asp.net下使用mysql數(shù)據(jù)庫的步驟

    近日,在項目中遇到了麻煩,客戶非要求使用mysql數(shù)據(jù)庫,對于我從來么有使用過的人來說,很是頭疼,最后還是硬著頭皮弄好了。期間也遇到了各種各樣的問題,現(xiàn)在把他整理在此,希望對那些和我一樣從來沒有使用過的人,能快速入手
    2012-05-05
  • WPF自定義路由事件

    WPF自定義路由事件

    這篇文章介紹了WPF自定義路由事件的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Entity?Framework代碼優(yōu)先Code?First入門

    Entity?Framework代碼優(yōu)先Code?First入門

    這篇文章介紹了Entity?Framework的代碼優(yōu)先模式Code?First,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • .NET中基于事件的異步模式-EAP

    .NET中基于事件的異步模式-EAP

    從.NET 4.5開始,支持的三種異步編程模式:基于事件的異步編程設(shè)計模式、異步編程模型、基于任務(wù)的編程模型,感興趣的朋友可以參考下
    2013-01-01
  • EF?Core基礎(chǔ)入門教程

    EF?Core基礎(chǔ)入門教程

    這篇文章介紹了EF?Core的基礎(chǔ)入門教程,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • asp.net 獨立Discuz頭像編輯模塊分離打包

    asp.net 獨立Discuz頭像編輯模塊分離打包

    在Discuz產(chǎn)品系列(包括UCenter、UCHome)中有一個flash頭像上傳編輯的功能比較好用,和之前自己用js實現(xiàn)的照片在線編輯插件比較像,于是想將它獨立出來,一方面可以學(xué)習(xí)研究,另一方面有機會可以在項目中使用(這里主要是指Asp.Net程序,php的與之類似)。
    2011-06-06
  • 動態(tài)指定任意類型的ObjectDataSource對象的查詢參數(shù)

    動態(tài)指定任意類型的ObjectDataSource對象的查詢參數(shù)

    我在使用ObjectDataSource控件在ASP.NET中實現(xiàn)Ajax真分頁 一文中詳細介紹過如何使用ObjectDataSource和ListView實現(xiàn)數(shù)據(jù)綁定和分頁功能。事實上,采用ObjectDataSource和ListView相結(jié)合,可以減少我們很多的開發(fā)任務(wù)。
    2009-11-11

最新評論