angular solo ofrece una opción de fábrica / servicio singleton . una forma de evitarlo es tener un servicio de fábrica que creará una nueva instancia para usted dentro de su controlador u otras instancias de consumo. lo único que se inyecta es la clase que crea nuevas instancias. este es un buen lugar para inyectar otras dependencias o para inicializar su nuevo objeto a la especificación del usuario (agregando servicios o configuración)
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);
}
luego, en su instancia de consumidor, necesita el servicio de fábrica y llama al método de compilación en la fábrica para obtener una nueva instancia cuando la necesite
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);
}
}
puede ver que brinda la oportunidad de inyectar algunos servicios específicos que no están disponibles en el paso de fábrica. siempre puede hacer que la inyección ocurra en la instancia de fábrica para que la utilicen todas las instancias del modelo.
Tenga en cuenta que tuve que quitar algo de código para que pudiera cometer algunos errores de contexto ... si necesita una muestra de código que funcione, hágamelo saber.
Creo que NG2 tendrá la opción de inyectar una nueva instancia de su servicio en el lugar correcto en su DOM, por lo que no necesita crear su propia implementación de fábrica. Tendré que esperar y ver :)