angular só dá um singleton opção de serviço / fábrica. uma maneira de contornar isso é ter um serviço de fábrica que criará uma nova instância para você dentro de seu controlador ou outras instâncias de consumidor. a única coisa que é injetada é a classe que cria novas instâncias. este é um bom lugar para injetar outras dependências ou para inicializar seu novo objeto com a especificação do usuário (adicionando serviços ou configuração)
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);
}
então, em sua instância de consumidor, você precisa do serviço de fábrica e chama o método de construção na fábrica para obter uma nova instância quando precisar
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);
}
}
você pode ver que ele fornece oportunidade para injetar alguns serviços específicos que não estão disponíveis na etapa de fábrica. você sempre pode fazer a injeção acontecer na instância de fábrica para ser usada por todas as instâncias de Model.
Note que tive que retirar algum código, então posso cometer alguns erros de contexto ... se você precisar de um exemplo de código que funcione, me avise.
Acredito que NG2 terá a opção de injetar uma nova instância de seu serviço no lugar certo em seu DOM, de forma que você não precise construir sua própria implementação de fábrica. Vai ter que esperar e ver :)