angular ne donne qu'une option de service / usine unique . une façon de contourner le problème est d'avoir un service d'usine qui créera une nouvelle instance pour vous à l'intérieur de votre contrôleur ou d'autres instances de consommateur. la seule chose qui est injectée est la classe qui crée de nouvelles instances. c'est un bon endroit pour injecter d'autres dépendances ou pour initialiser votre nouvel objet aux spécifications de l'utilisateur (ajout de services ou de configuration)
namespace admin.factories {
'use strict';
export interface IModelFactory {
build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel;
}
class ModelFactory implements IModelFactory {
// any injection of services can happen here on the factory constructor...
// I didnt implement a constructor but you can have it contain a $log for example and save the injection from the build funtion.
build($log: ng.ILogService, connection: string, collection: string, service: admin.services.ICollectionService): IModel {
return new Model($log, connection, collection, service);
}
}
export interface IModel {
// query(connection: string, collection: string): ng.IPromise<any>;
}
class Model implements IModel {
constructor(
private $log: ng.ILogService,
private connection: string,
private collection: string,
service: admin.services.ICollectionService) {
};
}
angular.module('admin')
.service('admin.services.ModelFactory', ModelFactory);
}
Ensuite, dans votre instance consommateur, vous avez besoin du service d'usine et appelez la méthode de construction sur l'usine pour obtenir une nouvelle instance lorsque vous en avez besoin
class CollectionController {
public model: admin.factories.IModel;
static $inject = ['$log', '$routeParams', 'admin.services.Collection', 'admin.services.ModelFactory'];
constructor(
private $log: ng.ILogService,
$routeParams: ICollectionParams,
private service: admin.services.ICollectionService,
factory: admin.factories.IModelFactory) {
this.connection = $routeParams.connection;
this.collection = $routeParams.collection;
this.model = factory.build(this.$log, this.connection, this.collection, this.service);
}
}
vous pouvez voir qu'il offre l'opportunité d'injecter des services spécifiques qui ne sont pas disponibles dans l'étape d'usine. vous pouvez toujours avoir une injection sur l'instance de fabrique à utiliser par toutes les instances de modèle.
Notez que j'ai dû supprimer du code pour que je puisse faire des erreurs de contexte ... si vous avez besoin d'un exemple de code qui fonctionne, faites-le moi savoir.
Je crois que NG2 aura la possibilité d'injecter une nouvelle instance de votre service au bon endroit dans votre DOM afin que vous n'ayez pas besoin de créer votre propre implémentation d'usine. devra attendre et voir :)