微服务乱码_netcore 之动态代理(微服务专题)
動態(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? 內部傳遞了參數(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 之动态代理(微服务专题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 延迟2秒执行_每天30秒
- 下一篇: 1400协议是什么和28181区别_舞阳