AngularJS服務中serivce,factory,provider的區別

白牙青森發表於2015-03-24

Angular服務是一個由服務工廠建立的單例物件。這些服務工廠是由 service provider 依次建立的。而service providers是建構函式。它們必須包含一個$get屬性用於在例項化的時候返回服務工廠。

當你請求一個服務,$injector負責找到正確的service provider,然後將它例項化得到service factory,並呼叫service factory的 $get 方法來得到服務的例項。

  • provider(provider) - 使用$injector來註冊一個 service provider 。
  • constant(obj) - 註冊一個只有providers 和 services 可以訪問的 值或物件。
  • value(obj) - 註冊一個只有services 可以訪問的 值或物件。
  • factory(fn) - 註冊一個 service factory 方法,該方法被包裹在 provider 物件當中,並通過 $get 屬性來返回這個 factory 方法。
  • service(class) - 註冊一個構造方法,它是一個被包裹在 service provider 物件中的類,然後通過 $get 屬性來使用該構造方法例項化一個新的物件。

provider(name, provider);

引數型別詳細
name string

例項(也就是service factory)名稱。記住:它的 provider 需要通過 name + 'Provider' 來訪問。

provider Object/function()

如果這個 provider 是:

  • 物件: 那麼它應該有一個 $get 方法。 這個 $get 方法會在一個例項需要被建立的時候使用$injector.invoke() 來呼叫。
  • 建構函式: 那麼它會使用 $injector.instantiate() 來建立一個provider 的例項,並以物件的形式返回。

 

factory(name, $getFn);

註冊一個service factory,它用於返回一個service 的例項。這是一個註冊service factory的簡單的寫法,因為它的provider 僅僅包含一個 $get 屬性。如果你不需要在provider中配置你的 service ,那你可以使用它。

引數型別詳細
name string

例項的名稱

$getFn function()

建立例項的$get方法。 本質來說這是一個$provide.provider(name, {$get: $getFn})的簡寫法。

service(name, constructor);

註冊一個構造方法, 它會通過new方法來建立service例項。 這也是一個$provide.provider(name, {$get: $getFn})的簡寫法,但這裡$getFn是一個建構函式,然後通過new來返回服務的例項。

如果你將你的服務定義為一個type或class,你應該使用$provide.service(class)。

value(name, value);

通過 $injector 註冊一個value service,它可以是一個字串、數值、陣列、物件或者方法。該值實際上也是通過它的provider的$get屬性,一個沒有引數的方法來返回的value service。

它跟constant services很像,但不同點在於他們不能被注入到模組的配置方法中。

相關文章