精通MVC 5 學習筆記 =========依賴項注入====建立鬆耦合元件
阿新 • • 發佈:2018-11-10
前46頁感覺都沒什麼用,
實體類效驗沒有卵用,日常用不到
Razor 輔助器 ,用的比較少
建立鬆耦合元件
我在這裡就用自己的話來寫一下我學到的東西:
首先有三個個體 : 介面
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ASPNETMVC5.Interface { public interface IEmailSender { string Send(); } }
,介面的實現類 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ASPNETMVC5.Interface
{
public class MyEmailSender : IEmailSender
{
public string Send()
{
return "傳送中";
}
}
}
想要使用該介面中方法的類
首先介面可以被多個子類繼承,同時介面本身也期待被繼承(被繼承後重寫方法才能完成實際的任務)
所以介面被實現是不可或缺的一步
如上程式碼介面已經實現,現在就等著外界呼叫了,按照常規思想,我們會例項化 介面的實現類再呼叫其中的方法
namespace ASPNETMVC5.Interface
{
public class PasswordResetHelper
{
IEmailSender sender = new MyEmailSender();
public void ResetPassword()
{
sender.Send();
}
}
}
這導致了該類與 介面 和介面實現類都產生了關係 ,如果某一天我們用其他的 介面實現類來替代原先的類(MyEmailSender)
導致我們不得不在(PasswordResetHelper ) 中修改程式碼 IEmailSender sender = new MyEmailSender();改為其他
如果專案足夠大你需要花費好幾個步驟才能找到它 ,並修改.而且無法預知在什麼地方有什麼其他運用,拓展性極差
依賴項注入:
本例子最後就是為了引出這個好用的方法
public class PasswordResetHelper
{
IEmailSender sender;
public PasswordResetHelper(IEmailSender senderArgs)
{
sender = senderArgs;
}
public void ResetPassword()
{
sender.Send();
}
}
建構函式需要傳入一個 介面型別 : 用於接收 介面的實現類
類中有一個介面型別的變數 : 用於接收 介面的實現類
這種結構稱之為 : 將 PasswordResetHelper 類 的建構函式 對 IEmailSender 介面 宣告 了一個依賴項
解釋:除非接收一個實現了介面的物件,否者不能使用和建立它 ,這裡的 PasswordResetHelper 類 已經和 MyEmailSender
沒有依賴關係 ,僅僅和 介面是依賴關係
記得在 支付寶的SDK中見到過類似的機構,當時還沒有學到這一招,既然阿里的工程師都在用說明就是好東西