有些軟體公司開發的 .NET component 和 control,若開發前未經妥善規劃,當您在 Visual Studio 中引用這些 DLL 並按下 F5 鍵後,說不定要等上一分鐘或更久,才能完成整個 solution 的 compile 動作。
在 Java 中,當我們要在程式中引用 class library 的某個 package (即 .NET 的 namespace) 的 class 時,不必整個 package 全部匯入,而可在程式或網頁的最上方,直接指定要匯入某一個特定的 class,如下:
// 引用 ArrayList 類
import java.util.ArrayList;
這就是告訴 compiler 說,我想使用 ArrayList 這個 class。當然若我們還想引用 util 內的其它 class,不必逐一宣告,只要以 * 號代表即可:
import java.util.*;
雖然第二種寫法在使用上較方便,但卻會影響 compile 的時間和效能 [1]。然而在 .NET 中,卻只能用第二種寫法,無法用第一種;亦即在 .NET 中若只是想引用 ArrayList 這個 class,也無從選擇,只能把整個 System.Collections namespace 及其底下的 class 全部匯入您的 project 或網站裡,這點不禁令人質疑,為何微軟會如此設計,抑或 .NET 在底層有搭配其它的解析機制。
-----------------------------------------------------------
接下來提到在開發 ASP.NET custom control 之前,應先做好哪些規劃,而非只是把需要的功能做出來即交差了事,造成其它程式員在引用時的痛苦 (就像本帖一開始談到的那家軟體公司的情況)。
在開發您公司的 custom control library 前,第一步要決定的,是您的多個「自訂控制項」要編譯成單一個 DLL,抑或切割成多個 DLL。
當您在單一個 custom control library project 中,寫了多個 custom control (多個 class),他們全部會編譯成單一個 DLL,此時若有應用程式要引用其中一個 custom control 時,就會將其它全部的 control 也全部「載入 (load)」。一般會比較推薦這種做法,版工我發現,微軟的 Ajax Control (AjaxControlToolkit.dll) 也是採用此種做法。
當然您也可以在每一個 custom control library project 裡面,都只放一個 class。如此一來,每一個 custom control 都會被編譯成單一個 DLL,這樣做的好處是 DLL 的檔案比較小,其它 website 或 application 在引用時,載入的速度也會比較快。但有一點千萬要記得,載入 DLL 是要代價的,當一個 website 或 application 需要引用三個 class 時,載入三個各有一個 class 的 DLL,會比載入包含三個 class 的單一個 DLL,在效能上要慢得多。
此外還有一點要考慮的,就是 application 在引用這些 custom control 時,在 custom control 所參考到的其它外部 class 也會一併被載入,這也會造成 DLL 的 size 變大,而且 application 在引用時也會較耗 memory、載入時間也較久 (就像本帖一開始談到的那家軟體公司的情況)。
因此若您的 custom control 會參考到的外部 class 都類似或相同,那就比較適合將這些 custom control 編譯成同一個 DLL;但若參考到的外部 class 差異性極大,就該考慮切成不同的 DLL,避免 application 在引用此 DLL 時,載入了過多的外部 class 或用不到的 class,而拖累了效能。
此外,您也可以在單一個 .VB 或 .CS 檔案裡,定義多個 class。這樣做雖然可讓單一個檔案產生多個 custom control,但這樣做並不會帶來任何效能上的協助,而且會造成其它人在引用和維護上的困擾。
-----------------------------------------------------------
參考書籍:
[1] Bruce Eckel, "Thinking in Java (2e)", Chapter 2.
[2] Peter Vogel, "Professional Web Parts and Custom Controls with ASP.NET 2.0", Chapter 3.
-----------------------------------------------------------