2016-06-11 33 views
0

通過指定其註冊名稱來注入角色1.x服務。例如使用打字稿:angular2 DI膠過多還是有其他方法?

// appointments.ts 
export interface IAppointmentServices { 
    retrieve(start: Date, end: Date): Appointment[] 
} 

// appointment-services.ts: 
class AppointmentServices implements IAppointmentServices { 
    retrieve(start: Date, end: Date): Appointment[] { 
      ... 
    } 
} 

angular.module('appointments') 
     .service('AppointmentServices', AppointmentServices); 

// appointment-controller.ts 
class AppointmentController { 
    constructor (private service: IAppointmentService) { 
    } 
    // pay attention that 'AppointmentServices' is the registered name 
    // not a hard reference to the class AppointmentServices 
    static $inject = ['AppointmentServices'] 
} 

講究控制器實現了以任何方式文件,也沒有實現服務

但在角2類的參考,以實現類似DI你要的東西在這幾行:

import {Component} from 'angular2/core'; 
import {AppointmentServices} from 'appointment-services'; 

@Component({ 
    ... 
    providers: [AppointmentServices] 
}) 
export class Appointment { 
    constructor (service: AppointmentServices) { 
     ... 
    } 
} 

注意,在上面的第二個進口,我必須以指定AppointmentServices實施以及名稱的位置代表一個組件和服務之間的粘合

有沒有在angular2注入服務沒有指定類和實現它的文件的方式嗎?

我覺得這angular2方法是怎樣的一個步驟回在其前任完成的IoC而言,如果DI在這樣做!

回答

2

有沒有這樣的方式,因爲這是import/export功能簡直是如何工作的。爲了import的東西,它必須同樣exported(同名),在別的地方。

因此,爲什麼在一個文件中(預約服務),你必須

export class AppointmentServices 

與其他組件文件使用對象銷燬「搶」的是具體的東西(這是從它導出)

import { AppointmentServices } from 'appointment-services'; 

這兩個鏈接,因爲,這是他們如何互相訪問。雖然這可能看起來是「倒退」,但TypeScript和IDE現在有能力輕鬆重構整個庫,因爲他們知道這些導出/導入。

所以,如果你想將其更改爲export class AnotherAppoinmentService相反,你可以重構它,你的IDE會自動切換他們都爲您服務!

注意:Angular1模塊將所有東西都存儲爲「字符串」,爲什麼事情是鬆散指定的。你通常必須做MyClass.name例如

+1

好的答案:)這也允許區分具有相同名稱的兩個服務(來自不同的庫)以避免意外的衝突。它也允許適當的抖動,因爲它可以在標識符來自哪裏進行跟蹤。未導入的庫已知是未使用的,可以跳過。 Angular1的方式是典型的JS方式,你需要希望你不要忘記命名一致。在TypeScript中,工具可以提供很多指導,但他們需要明確的信息。 –

+0

我仍然認爲這是太多膠水,在IoC方面倒退了一步。看看http://inversify.io/這是我真正想要的。這是一個真正的IoC方法,因爲angular2中組件和服務之間的嚴重依賴性並不方便 –

相關問題