1. 程式人生 > >精通MVC 5 學習筆記 =========依賴項注入====建立鬆耦合元件

精通MVC 5 學習筆記 =========依賴項注入====建立鬆耦合元件

前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中見到過類似的機構,當時還沒有學到這一招,既然阿里的工程師都在用說明就是好東西