iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
1
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 8

08.ConfigureServices使用擴充方法添加功能

在miniblog ConfigureServices方法裡可以觀察到處處都是services.AddXXX,services.AddYYY

public void ConfigureServices(IServiceCollection services)  
{  
	services.AddXXX();  
	services.AddYYY();  
	//..等等  
}  

可以注意到services是一個介面物件(IServiceCollection )
這時候讀者假如是一個Java工程師會很驚訝:通常介面是不會提供如此多方法提供使用
接著點進去查看更是驚訝,居然是一個空介面,只繼承一些集合類別。

    public interface IServiceCollection : IList<ServiceDescriptor>, ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IEnumerable{}  

那這些方法是從哪邊而來?

答案:從靜態類別Extensions擴展方法而來。

舉例

Miniblog提供MetaWeblog的功能,當我們去查看WilderMinds.MetaWeblog原始碼。
可以發現對應ConfigureServices下的AddMetaWeblog方法,使用this關鍵字加上IServiceCollection類別參數
並且是屬靜態方法靜態類別,達到擴充空介面IServiceCollection方法。

  public static class MetaWeblogExtensions  
  {
    public static IServiceCollection AddMetaWeblog<TImplementation>(this IServiceCollection coll) where TImplementation : class, IMetaWeblogProvider  
    {  
	//..略  
    }  
  }  

可以看到AddMetaWeblog使用介面參數避免類別依賴,達到依賴反轉原則,加上where條件避免使用者使用非MetaWeblogProvider家族的類別 。

Configure補充

  • 同樣Configure也是使用同樣方式註冊系統,擴充IApplicationBuilder的方法
    public static IApplicationBuilder UseMetaWeblog(this IApplicationBuilder builder)  
    {  
      //..略  
    }  
  • 這邊有一個小規範註冊IServiceCollection 通常以Addxxxx方法名稱開頭;
    IApplicationBuilder以Usexxx方法名稱開頭

閱讀資料:

Application startup in ASP.NET Core | Microsoft Docs

結論

難怪說asp.net core除了簡單、高效外,具備極佳開發彈性跟解耦合。
今天先簡單到這邊,明天會接續今天的內容接著延伸介紹MetaWeblog。


上一篇
07.優化CSS、JS文件
下一篇
09.MetaWeblog改寫:節省伺服器資源,圖片上傳到Imgur圖床
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30

尚未有邦友留言

立即登入留言