angular2 DI中的胶水太多还是有另一种方法?

时间:2016-06-11 00:09:17

标签: angular angular2-di

通过指定其注册名称注入角度1.x服务中的

。例如,使用TypeScript:

// 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中是否有一种方法可以在不指定类和实现它的文件的情况下注入服务?

我认为如果必须以这种方式完成DI,这种angular2方法在其前身中完成了IoC方面的退步!

1 个答案:

答案 0 :(得分:2)

没有这种方式,因为这只是import / export功能的工作原理。为了import某事,它必须同等地exported(同名),在其他地方。

因此,为什么在一个文件(约会服务)中有

export class AppointmentServices

使用对象销毁的另一个组件文件"抓住"特定的东西(从中输出)

import { AppointmentServices } from 'appointment-services';

这两者是相互联系的,就是他们互相访问的方式。虽然这看起来似乎是倒退的,但现在,TypeScript和IDE现在可以轻松地重构整个库,因为他们知道这些导出/导入。

因此,如果您想将其更改为export class AnotherAppoinmentService,您可以重构它,并且您的IDE可以自动为您切换它们!

  

注意:Angular1模块将所有内容存储为" String",为什么事情被松散地指定。您通常必须执行MyClass.name,例如