前言:
大家在寫程式時一定常常遇到要寫日誌,權限驗證....等等和主要邏輯不相干的事情
如果把上述這些動作寫在核心邏輯,會讓原有的程式碼變得雜亂
AOP(面向切面编程)可以有效的幫助我們解決上面問題,降低模塊間耦合度,理念來自於代理模式...
這次我們要把上一篇 ProxyPattern代理模式(一) 程式碼重構一下
我們先理解業務在哪邊,業務在下面紅框的部分 Console.log只是記錄此次驗證的資料
我們可以主要邏輯提取動作來做一個簽章
在我心中 介面代表能力,抽象類別代表這一類事物
因為在此次需求驗證是一種能力,所以我提出來成一個介面
public interface ISubject
{
bool IsAuth(UserModel user);
}
有兩個類別 LogicProxyService和Logicservice都實現 ISubject
因為不管是代理類別和被代理類別都擁有檢核能力
我們就可將主要邏輯寫在Logicservice
public class Logicservice : ISubject
{
MockUserData userList = new MockUserData();
public bool IsAuth(UserModel user)
{
return userList.GetAllUser()
.Any(o => user.UserName == o.UserName && user.Password == o.Password);
}
}
這邊我使用依賴注入的建構子注入,讓外界決定要注入哪個類別(需繼承ISubject)
可增加未來擴展性和移植性
可增加未來擴展性和移植性
撰寫日誌寫在LogicProxyService
public class LogicProxyService : ISubject
{
private ISubject _realSubjcet;
public LogicProxyService(ISubject sub)
{
_realSubjcet = sub;
}
public bool IsAuth(UserModel user)
{
Console.WriteLine($"使用者登入:帳號={user.UserName} 密碼={user.Password}");
return _realSubjcet.IsAuth(user);
}
}
在外界只需這樣使用
- 傳入被代理物件
- 使用代理物件呼叫方法
#region StaticProxy
var testUser = new UserModel() { Password = "1234", RowID = 1, UserName = "test" };
LogicProxyService staticProxy = new LogicProxyService(new Logicservice());
staticProxy.IsAuth(testUser);
#endregion
總結:
這樣程式碼就比上一篇乾淨許多了! 寫日誌的程式碼和主要邏輯分離開來
靜態代理最主要是將核心邏輯和非核心邏輯分割開來,讓程式碼保持乾淨
但靜態代理還是有個缺點,如我們需要擴充100個代理方法 我需要撰寫100代理類別
實在有夠累....
但別擔心在下章會介紹[動態代理模式]來解決此問題
如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^