はじめに
Robotlegsは、フラッシュ/フレックスアプリケーションを作成するためのMVCフレームワークです。 このフレームワークは、[Inject]メタタグを使用してインジェクションメカニズムを実装するswiftsuspendersライブラリに基づいています。 Googleはこのフレームワークの使用に関する多くの資料を持っています。 したがって、私は注射に直接こだわることはありません。 しかし、私が出会ったすべての記事で、説明されたのは注入メカニズムでしたが、注入されたクラスの宣言にはあまり注意が払われていませんでした。 この記事は、注入されたクラスを宣言する方法に専念したいと思います。
モデル発表
最も一般的には、モデルクラスが注入に使用されます。 Robotlegsフレームワークでは、Actorクラスを継承します。 注入されたクラスは、メインコンテキスト(Contextクラスの子孫)のstartup()メソッドで宣言されます。 インジェクターのプロパティは、さまざまなインジェクションメソッドを実装するメソッドであるインジェクションを担当しています。
後続の注入のためにクラスを登録(宣言)する方法はいくつかあります。 それらを考慮してください。
mapClass
mapClassが最も簡単な方法です。 要求されたクラス(またはインターフェース)は最初のパラメーターとして示され、クラスは2番目のパラメーターとして指定され、そのインスタンスは要求時に作成されます。 3番目の引数はオプションの識別子です。
この場合、必要なクラスの各リクエストは新しいインスタンスを作成します。 クラスコンストラクターは、引数を受け入れたり、デフォルト値を持つことはできません。
例:
インジェクター。 mapClass ( ITestClassActor、TestClassActor、 "testClassActor" ) ;
ITestClassActorの代わりにインジェクションを使用するすべてのクラスで、TestClassActorクラスのインスタンスが使用されるようになりました。 さらに、毎回新しいインスタンスになることに注意してください。
mapSingletonOf
mapSingletonOf-mapClassと同じように機能しますが、インスタンスが要求された場合にのみ、インスタンスは1回だけ作成されます。 そして、後続の各リクエストはこの特定のインスタンスを返します。
インジェクター。 mapSingletonOf ( ITestSingletonOfActor、TestSingletonOfActor ) ;
mapSingleton
mapSingleton-mapSingletonOfと同様に、クラスのインスタンスは1つだけ作成されますが、この場合は、挿入されたクラスのみが指定されます。
インジェクター。 mapSingleton ( TestSingletonActor ) ;
上記のメソッド自体が必要なクラスのインスタンスを作成するため、コンストラクターに引数を含めることはできません。 クラスを既存のオブジェクトに関連付ける必要がある場合は、mapValueメソッドを使用する必要があります。
mapValue
mapValue-クラスを特定のインスタンスにバインドするために使用されます。
インジェクター。 mapValue ( TestValueActor、 新しい TestValueActor ( ) ) ;
ただし、小さな機能があります。 前述のように、mapClass、mapSingletonOf、mapSingletonを使用すると、クラスのインスタンスが自動的に作成されます。 さらに、作成時にオブジェクト自体がインジェクションを使用する場合、すべてのインジェクションは必要なインスタンスで初期化されます。 mapValueを使用する場合、必要なインスタンスを作成しますが、オブジェクトは機能しません。 注入が機能するためには、injectIntoメソッドを使用して、インスタンスをパラメーターとして渡す必要があります。
より明確にするために、小さな例を考えてみましょう。
- パッケージテスト。 モデル
- {
- インポート組織。 robotlegs 。 mvcs 俳優
- / **
- *依存するクラス
- * @author Vadim(-FeLiX-)Seluyanov
- * /
- パブリック クラス TestValueActor はアクターを拡張します
- {
- パブリック 関数 TestValueActor ( )
- {
- スーパー ( ) ;
- }
- }
- }
- パッケージテスト。 モデル
- {
- インポート組織。 robotlegs 。 mvcs 俳優
- / **
- * TestValueActorに依存するクラス
- * @author Vadim(-FeLiX-)Seluyanov
- * /
- パブリック クラス TestInjectIntoActor はアクターを拡張します
- {
- [注入]
- public var testValueActor:TestValueActor;
- パブリック 関数 TestInjectIntoActor ( )
- {
- スーパー ( ) ;
- }
- }
- }
コンテキストの初期化:
- インジェクター。 mapValue ( TestValueActor、 新しい TestValueActor ( ) ) ; //依存クラスを特定のインスタンスにバインドします(他の方法で実行できます)
- var injectIntoActor:TestInjectIntoActor = new TestInjectIntoActor ( ) ; //依存クラスのインスタンスを作成します
- インジェクター。 mapValue ( TestInjectIntoActor、injectIntoActor ) ; //バインド
- trace ( ( injector。getInstance ( TestInjectIntoActor ) as TestInjectIntoActor ) 。testValueActor ) ; //注入前、プロパティはnull
- インジェクター。 injectInto ( injectIntoActor ) ; //注入する
- trace ( ( injector。getInstance ( TestInjectIntoActor ) as TestInjectIntoActor ) 。testValueActor ) ; //注入後、プロパティが設定されます
インジェクトされたインスタンスを宣言するための基本的な方法を調べました。
PS:私はまだ別の宣言メソッドを考慮していません:mapRuleメソッドを使用します。 今、私はそれがどのように機能するかを理解しています。 この方法に関する資料は、インターネットの私たちのセグメントにも西洋にもありません。 したがって、ソースを選択します。