angular fornisce solo un'opzione di servizio / fabbrica singleton . un modo per aggirare il problema è disporre di un servizio di fabbrica che creerà una nuova istanza per te all'interno del controller o di altre istanze consumer. l'unica cosa che viene iniettata è la classe che crea nuove istanze. questo è un buon posto per iniettare altre dipendenze o per inizializzare il nuovo oggetto secondo le specifiche dell'utente (aggiungendo servizi o configurazione)
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);
}
quindi nella tua istanza consumer hai bisogno del servizio di fabbrica e chiama il metodo build sulla fabbrica per ottenere una nuova istanza quando ne hai bisogno
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);
}
}
puoi vedere che fornisce l'opportunità di iniettare alcuni servizi specifici che non sono disponibili nel passaggio di fabbrica. puoi sempre fare in modo che l'iniezione avvenga sull'istanza di fabbrica per essere utilizzata da tutte le istanze del modello.
Nota ho dovuto rimuovere del codice in modo da poter commettere alcuni errori di contesto ... se hai bisogno di un esempio di codice che funzioni fammelo sapere.
Credo che NG2 avrà la possibilità di inserire una nuova istanza del tuo servizio nel posto giusto nel tuo DOM, quindi non avrai bisogno di costruire la tua implementazione di fabbrica. dovrò aspettare e vedere :)