2017-06-09 14 views
0

クラスを定義するために角定数を使用しています。インスタンス化するときにクラス定数にコンストラクタのパラメータを持たせることができますが、依存性注入もできるようにするにはどうしたらいいですか?依存性注入によるクラス定数のインスタンス化

ClassA.js

class ClassA { ... } 

angular.module("myApp").constant("ClassA", ClassA); 

ClassB.js

class ClassB { 
    constructor(constrParams, ClassA) { // mix of constructor parameter and DI 
    this.constrParams = constrParams; 
    this.ClassA = ClassA; 
    } 
} 

ClassB.$inject = ["ClassA"]; // ClassB needs reference to ClassA 
angular.module("myApp").constant("ClassB", ClassB); 

は、私はまだ別の一定の

にClassBのをインポートするときに、これを行うことができるだろう:私はこのような線に沿って考えています

ClassC.js

class ClassC { 
    constructor(ClassB) { 
    this.classBinst = new ClassB("myparams"); // instantiate new ClassB instance 
    } 
} 

ClassC.$inject = ["ClassB"]; 
angular.module("myApp").constant("ClassC", ClassC); 

答えて

0

私はサービスとしてのクラスを提供するフランクのアイデアを拡張し、代わりに工場構築体を使用していました。ファクトリは、サービス内の明示的なcreate関数ではなく、直接インスタンス化できるクラス定義を提供します。次のようにパターンがある:

ClassA.js

class ClassA { ... } 

angular.module("myApp").factory("ClassA",() => ClassA); 

ClassB.js

class ClassB { 
    constructor(constrParams) { 
    this.constrParams = constrParams; 
    // this.ClassA reference is already injected through factory 
    } 
} 

angular.module("myApp") 
.factory("ClassB", ["ClassA", (ClassA) => { 
    // this is where dependency injection happens 
    ClassB.prototype.ClassA = ClassA; 
    return ClassB; // class definition 
}]); 

ClassC.js(最終目標 - 前と同じ)

class ClassC { 
    constructor() { 
    // instantiate new ClassB instance 
    this.classBinst = new this.ClassB("myparams"); 
    } 
} 

angular.module("myApp").factory("ClassC", ["ClassB", (ClassB) => { 
    ClassC.prototype.ClassB = ClassB; 
    return ClassC; 
}]); 

関連パターン:Correct way of wrapping javascript class in AngularJS module and inject angular services

1

任意のコンストラクタ引数を手動で渡したい場合は、それらをすべて手動で渡す必要があると思います。

のでClassCClassBにそれを渡すために、同様のパラメータとしてClassAに取る必要があります:

class ClassC { 
    constructor(ClassB, ClassA) { 
    this.classBinst = new ClassB("myparams", ClassA); // instantiate new ClassB instance 
    } 
} 

しかし、その後、あなたがClassCを必要とするClassDを作成した場合、あなたは同じ問題で立ち往生しています - ClassCとそのすべての依存関係(ClassBClassA)を渡す必要があります。

しかしClassCが最終レベルであるとシングルトンとしてインスタンス化して注入することができるならば、あなたは、あなたがその依存関係を気にすることなくClassCをインスタンス化するサービスを作成することができます

angular.module("myApp").service('instanceC', ClassC); 

angular.module("myApp").controller('myController', function (instanceC) { 
    // Everything has been resolved 
}); 

たぶん、あなたは思いますこれらのクラスのインスタンスを作成するサービスを作成する方がよいでしょう。コントローラは、任意のカスタムパラメータを渡すことができますが、そのサービスは、クラスが必要な依存関係を解決し、手動でそれらを渡すことができます。

class factory { 
    constructor(ClassA, ClassB, ClassC) { 
     this.ClassA = ClassA; 
     this.ClassB = ClassB; 
     this.ClassC = ClassC; 
    } 

    createB(customParamForClassB) { 
     return new this.ClassB(customParamForClassB, this.ClassA) 
    } 
} 

angular.module("myApp").service('factory', factory); 

angular.module("myApp").controller('myController', function (factory) { 
    let instanceB = factory.createB('myparams'); 
}); 
+0

アイデアを編集し、代わりにファクトリを使用しました。これにより、依存関係注入を実行しながら明示的な作成関数の代わりにインスタンス化する実際のクラス定義が提供されます – geofrey