簡體   English   中英

避免使用全局對象進行角度依賴注入

[英]Avoiding angular dependency injection with use of global object

我繼承了一些使用全局對象存儲角度服務的代碼。 這些服務在角度模塊的運行功能中附加到全局對象。 我的問題是,這會在以后引起麻煩嗎? 這會給測試帶來什么麻煩? 像這樣傳遞服務似乎比在每個控制器中注入所有服務容易得多,所以我明白了為什么這樣做。 還有什么其他理由不這樣做呢? 這是一些代碼來說明我在說什么:

// vars
var globalObject =
{
    ng: {},
};

// Setup module
var myModule = angular.module("myModule", []);
myModule.config(doStuff);
myModule.run(setUpGlobals);

// Setup app globals
function setUpGlobals(ngRootScope, ngHttp, ngTimeout)
{
    globalObject.rootScope = ngRootScope;

    // angular services
    globalObject.ng.http = ngHttp;
    globalObject.ng.Timeout = ngTimeout;
}
setUpGlobals.$inject = ['$rootScope', '$http', '$timeout'];

這使得測試噩夢。 Dependency Injection非常好,因為它意味着您可以通過模擬不需要的服務來進行一些原子測試。 在一個簡單的,不引人注意的示例中,想象一下通過http進行API調用的服務,如果您將其直接輸入,您的測試可以模擬出http並偽造一個返回值,從而僅測試所需的代碼段,然后避免您進行依賴API的測試,或更糟糕的是使用了API調用的測試服。 對於全球范圍內的提供商,要實現這一目標要困難得多。

只有一個原因,我敢肯定還有很多其他原因。

正是在Angular中引入了模塊和DI,以避免依賴全局變量並提高模塊化。

這是一種幼稚的方法,僅在具有單個模塊和單個應用程序實例的情況下有效。 如果有幾個模塊可以單獨使用(包括測試),它將失敗。 如果頁面上有多個應用程序實例(例如,如果Angular用於非SPA應用程序),它將產生可怕的錯誤。

整體模塊會損害可測試性。 即使這樣使用,某些選項也將不可用,例如在$controller(...)注入間諜服務或存根服務-因為控制器依賴於全局變量。

setUpGlobals導致急切的服務實例化。 對於核心服務,這可能不是問題,但對於現在不需要實例化的服務,這將是一個問題。

較小的關注點是縮小應用程序中的代碼大小。 ng.$rootScope可以最小化為a.$rootScope但不能再縮小。 注釋功能應該提到'$rootScope'串一次,但$rootScope變量名可以精縮至a 如果在一個函數中多次使用一項服務,將會有所改善。

全局變量不好的原因有很多。 其中一些不適用於這種情況,其他則適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM