網站首頁 編程語言 正文
需要記錄日志的地方包括:進入方法的時候,傳參的時候,統計執行時間,方法返回參數的時候,退出語句塊的時候,出現異常的時候,等等。先來體驗不使用Micirosoft Unity進行日志記錄。
class Program
{
static void Main(string[] args)
{
Add(1, 2);
Console.ReadKey();
}
private static int Add(int a, int b)
{
int result = 0;
string temp = string.Empty;
string returnValue = string.Empty;
try
{
//記錄進入方法
Console.WriteLine("馬上要執行方法了");
temp = string.Format("輸入的參數為:a={0},b={1}", a, b);
Console.WriteLine(temp);
//統計方法執行時間
Stopwatch watch = new Stopwatch();
watch.Start();
result = a + b;
watch.Stop();
Console.WriteLine("程序執行時間為{0}", watch.Elapsed);
//記錄返回值
returnValue = string.Format("返回結果是:{0}", result);
Console.WriteLine(returnValue);
//記錄方法執行接收
Console.WriteLine("方法執行結束");
}
catch (Exception ex)
{
//記錄異常
Console.WriteLine(string.Format("異常信息是:{0},輸入參數是:{1}", ex.ToString(), temp));
throw;
}
finally
{
//記錄異常處理
Console.WriteLine("異常已經被處理了");
}
return result;
}
}
以上,還是存在一些問題:
- 違反了"DRY"原則,如果還有其它方法,需要不斷地寫記錄的邏輯
- 對閱讀代碼造成影響
- 耗時
Microsoft Unity的出現就是解決以上問題。
- Proxy object or derived class是Unity攔截器,在執行方法前后進行攔截
- Behaviors Pipeline是攔截行為管道,通過API注冊
- Target Object or Original class method是進行攔截的目標對象
引用Unity和Unity.Interception組件
輸入關鍵字Unity,通過NuGet安裝Unity。
輸入關鍵字Unity.Interception,通過NuGet安裝Unity Interception Extension。
安裝完后,相關組件包括:
自定義攔截器
自定義的攔截器必須實現IInterceptionBehavior接口。
public class MyInterceptionBehavior : IInterceptionBehavior
{
//返回攔截行為所需要的接口
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
/// <summary>
/// 使用本方法實施攔截行為
/// </summary>
/// <param name="input">目標方法的參數</param>
/// <param name="getNext">在攔截管道中的攔截行為的委托</param>
/// <returns>目標方法的返回值</returns>
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine("hello,方法馬上開始執行~~");
IMethodReturn msg = getNext()(input, getNext);
Console.WriteLine("bye,方法執行完了");
return msg;
}
//是否啟用攔截
public bool WillExecute
{
get { return true; }
}
}
定義一個計算的接口
public interface ICalculator
{
int Add(int value1, int value2);
int Subtract(int value1, int value2);
int Multiply(int value1, int value2);
int Divide(int value1, int value2);
}
對接口實現
public class Calculator : ICalculator
{
public int Add(int value1, int value2)
{
int res = value1 + value2;
Console.WriteLine(res);
return res;
}
public int Subtract(int value1, int value2)
{
int res = value1 - value2;
return res;
}
public int Multiply(int value1, int value2)
{
int res = value1 * value2;
return res;
}
public int Divide(int value1, int value2)
{
int res = value1 / value2;
return res;
}
}
配置文件中配置Unity
<configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <alias alias="ICalculator" type="MyLogging.ICalculator, MyLogging"/> <alias alias="Calculator" type="MyLogging.Calculator, MyLogging"/> <alias alias="MyBehavior" type="MyLogging.MyInterceptionBehavior, MyLogging" /> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" /> <container> <extension type="Interception"/> <register type="ICalculator" mapTo="Calculator"> <interceptor type="InterfaceInterceptor" /> <interceptionBehavior type="MyBehavior"/> </register> </container> </unity> </configuration>
以上,
- 通過<alias>節點為接口和類設置別名
- type="MyLogging.ICalculator, MyLogging"中,逗號前面是類名,逗號后面是程序集名稱
客戶端調用
using System;
using System.Collections.Generic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
class Program
{
static void Main(string[] args)
{
//加載UnityContainer
IUnityContainer container = new UnityContainer();
container = Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container);
//解析出接口
ICalculator calc = Microsoft.Practices.Unity.UnityContainerExtensions.Resolve<ICalculator>(container);
//執行方法
int res = calc.Add(1, 2);
Console.ReadKey();
}
}
原文鏈接:https://www.cnblogs.com/darrenji/p/3963789.html
相關推薦
- 2023-12-24 http中的get和post方法的區別
- 2022-08-14 Selenium定位瀏覽器彈窗方法實例總結_python
- 2023-01-02 Flutter?包管理器和資源管理使用學習_Android
- 2022-02-18 Zabbix Database error
- 2024-04-06 linux中redis重啟,啟動,停止的sh腳本
- 2022-11-05 swift語言AutoreleasePool原理及使用場景_Swift
- 2022-05-06 input 限制輸入 小數點后兩位
- 2023-12-16 IDEA中調用方法時,同步顯示方法的注釋信息
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支