日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微服务乱码_netcore 之动态代理(微服务专题)

發(fā)布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微服务乱码_netcore 之动态代理(微服务专题) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

動態(tài)代理配合rpc技術調用遠程服務,不用關注細節(jié)的實現(xiàn),讓程序就像在本地調用以用。

因此動態(tài)代理在微服務系統(tǒng)中是不可或缺的一個技術。網(wǎng)上看到大部分案例都是通過反射自己實現(xiàn),且相當復雜。編寫和調試相當不易,我這里提供里一種簡便的方式來實現(xiàn)動態(tài)代理。

1、創(chuàng)建我們的空白.netcore項目?

通過vs2017輕易的創(chuàng)建出一個.netcore項目

2、編寫Startup.cs文件

默認Startup 沒有構造函數(shù),自行添加構造函數(shù),帶有??IConfiguration 參數(shù)的,用于獲取項目配置,但我們的示例中未使用配置

在ConfigureServices 配置日志模塊,目前core更新的很快,日志的配置方式和原來又很大出入,最新的配置方式如下

添加路由過濾器,監(jiān)控一個地址,用于調用我們的測試代碼。netcore默認沒有UTF8的編碼方式,所以要先解決UTF8編碼問題,否則將在輸出中文時候亂碼。

這里注意?Map? 內(nèi)部傳遞了參數(shù)?applicationBuilder ,千萬不要 使用Configure(IApplicationBuilder app, IHostingEnvironment env ) 中的app參數(shù),否則每次請求api/health時候都將調用這個中間件(app.Run會短路期后邊所有的中間件),

3、代理

netcore 已經(jīng)為我們完成了一些工作,提供了DispatchProxy 這個類

這個類提供了一個實例方法,一個靜態(tài)方法:

Invoke(MethodInfo targetMethod, object[] args)?(注解1)

Create()(注解2)

Create 創(chuàng)建代理的實例對象,實例對象在調用方法時候會自動執(zhí)行Invoke

首先我們創(chuàng)建一個動態(tài)代理類??ProxyDecorator:DispatchProxy? 需要繼承DispatchProxy??。

在DispatchProxy 的靜態(tài)方法??Create()中要求?TProxy :?DispatchProxy

ProxyDecorator 重寫??DispatchProxy的虛方法invoke?

我們可以在ProxyDecorator 類中添加一些其他方法,比如:異常處理,MethodInfo執(zhí)行前后的處理。

重點要講一下?

ProxyDecorator 中需要傳遞一個 T類型的變量?decorated 。

因為??DispatchProxy.Create>();?會創(chuàng)建一個新的T的實例對象?,這個對象是代理對象實例,我們將?decorated 綁定到這個代理實例上

接下來這個代理實例在執(zhí)行T類型的任何方法時候都會用到?decorated,因為 [decorated] 會被傳給??targetMethod.Invoke(decorated, args)? ?(targetMethod 來自注解1) ,invoke相當于執(zhí)行

這樣說的不是很明白,我們直接看代碼

代碼比較簡單,相信大家都看的懂,關鍵的代碼和核心的系統(tǒng)代碼已經(jīng)加粗和加加粗+紅 標注出來了

DispatchProxy 類中有兩種創(chuàng)建代理實例的方法

我們看一下第一種比較簡單的創(chuàng)建方法

代碼中 UserService 和 IUserService 是一個class和interface? 自己實現(xiàn)即可 ,隨便寫一個接口,并用類實現(xiàn),任何一個方法就行,下面只是演示調用方法時候會執(zhí)行什么,這個方法本身在巖石中并不重要。

?由于ProxyDecorator 中并未注入相關事件,所以我們在調用 user.GetUserName(222) 時候看不到任何特別的輸出。下面我們演示一個相對復雜的調用方式。

IUserService user = serviceProxy.Create(userService, beforeEvent, afterEvent); 在創(chuàng)建代理實例時候傳遞了beforEvent 和 afterEvent,這兩個事件處理
函數(shù)是我們在業(yè)務中定義的

void beforeEvent(MethodInfo methodInfo, object[] arges)
{
System.Diagnostics.Debug.WriteLine("方法執(zhí)行前");
}

void afterEvent(MethodInfo methodInfo, object[] arges)
{
System.Diagnostics.Debug.WriteLine("執(zhí)行后的事件");
}

在代理實例執(zhí)行接口的任何方法的時候都會執(zhí)行? beforeEvent,和 afterEvent 這兩個事件(請參考Invoke(MethodInfo targetMethod, object[] args) 方法的實現(xiàn))

在我們的示例中將會在vs的?輸出?面板中看到?

方法執(zhí)行前

“方法輸出的值”

執(zhí)行后事件

我們看下運行效果圖:

?

?這是?user.GetUserName(222) 的運行結果

?控制臺輸出結果

原文鏈接:https://www.cnblogs.com/netqq/p/11452374.html

.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

總結

以上是生活随笔為你收集整理的微服务乱码_netcore 之动态代理(微服务专题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。