2016-06-11 16 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中组件和服务之间的严重依赖性并不方便 –

相关问题