angularはシングルトンサービス/工場オプションのみを提供します。それを回避する1つの方法は、コントローラーまたは他のコンシューマーインスタンス内に新しいインスタンスを構築するファクトリサービスを用意することです。注入されるのは、新しいインスタンスを作成するクラスだけです。これは、他の依存関係を注入したり、新しいオブジェクトをユーザーの指定に初期化したりするのに適した場所です(サービスまたは構成を追加します)。
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);
}
次に、コンシューマインスタンスでファクトリサービスが必要になり、ファクトリでbuildメソッドを呼び出して、必要なときに新しいインスタンスを取得します。
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);
}
}
ファクトリー・ステップでは使用できないいくつかの特定のサービスを注入する機会を提供することがわかります。すべてのモデルインスタンスで使用されるファクトリインスタンスで常にインジェクションを発生させることができます。
いくつかのコードを取り除く必要があったので、いくつかのコンテキストエラーが発生する可能性があることに注意してください...機能するコードサンプルが必要な場合はお知らせください。
NG2には、サービスの新しいインスタンスをDOMの適切な場所に挿入するオプションがあるため、独自のファクトリ実装を構築する必要がないと思います。待って見てください:)