2016-06-11 1 views
0

dans les services angulaires 1.x ont été injectés en spécifiant son nom enregistré. Par exemple en utilisant tapuscrit:trop de colle dans angular2 DI ou y a-t-il un autre moyen?

// 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'] 
} 

attention à ce que la mise en œuvre du contrôleur n'a pas de référence de quelque manière que le fichier ni la classe qui implémente le service

mais dans 2 angulaire, pour accomplir une DI similaire vous avez quelque chose comme dans ces lignes:

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

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

attention de salaire que dans la deuxième importation ci-dessus, je dois préciser l'endroit où les AppointmentServices est mis en œuvre ainsi que le nom de la classe qui représente un lien entre le composant et l'implémentation du service

Existe-t-il un moyen dans angular2 d'injecter le service sans spécifier la classe et le fichier qui l'implémente?

Je pense que cette approche angulaire2 est un peu un pas en arrière en termes d'IoC accompli dans son prédécesseur si DI doit être fait de telle manière!

Répondre

2

Il n'y a pas de telle manière, car c'est simplement comment la fonctionnalité import/export fonctionne. Pour import quelque chose, il doit être également exported (par le même nom), ailleurs.

Dès lors, pourquoi dans un fichier (rendez-vous-services) que vous avez

export class AppointmentServices 

Et l'autre fichier composant que vous utilisez Destruction d'objets pour « saisir » cette chose spécifique (qui a été exporté de celui-ci)

import { AppointmentServices } from 'appointment-services'; 

Ces deux sont liés, en cela, c'est comment ils accèdent les uns aux autres. Bien que cela puisse sembler "rétrograde", TypeScript et les EDI ont maintenant le pouvoir de refactoriser une bibliothèque entière avec facilité maintenant, puisqu'ils sont conscients de ces exportations/importations. Donc, si vous vouliez le remplacer par export class AnotherAppoinmentService, vous pourriez le refactoriser, et votre IDE pourrait les changer automatiquement pour vous!

Remarque: Les modules Angular1 stockaient tout sous la forme «String», c'est pourquoi les éléments étaient spécifiés de manière lâche. Vous devez généralement faire MyClass.name par exemple

+1

Bonne réponse :) Cela permet également de distinguer deux services avec le même nom (de bibliothèques différentes) pour éviter les collisions inattendues. Cela permet également de bien agiter les arbres car il peut être suivi d'où proviennent les identifiants. Les bibliothèques qui ne sont pas importées sont connues pour être inutilisées et peuvent être ignorées. La façon Angular1 est la manière typique de JS où vous devez espérer que vous n'oublierez pas de nommer quelque chose de manière cohérente. Dans TypeScript, les outils peuvent fournir beaucoup de conseils, mais ils ont besoin d'informations explicites. –

+0

Je pense toujours que c'est trop de colle et un pas en arrière en termes d'IoC. Jetez un oeil à http://inversify.io/ qui est ce que je cherchais vraiment. C'est une véritable approche de l'IoC car la dépendance entre un composant et un service en angular2 n'est pas pratique –