依存性注入; でも、どうやって?

依存性注入に関するドミニクジェリーノの記事の翻訳およびRobotlegsフレームワークでの実装方法。 ドミニクは、開発者がRobotlegsで注射を使用するときに持つ魔法の感覚を払拭しようとします。



出典: www.zedia.net/2010/dependency-injection-ok-but-how



注入する



皆さんのためのRobotlegsが増えましたが、今回はより概念的な方法です。



Robotlegsで私をイライラさせたのは、Dependency Injectionの表現そのものでした。 クールな言葉、それは重要な何かを意味するはずです。 はい、彼を見ただけです。 深く行くことなく。 時間をかけて考えてみると、すべてが少し違うことに気付くでしょう。



私たちが行うことの半分は注入です


さて、依存性注入を実装する方法は実際には非常に簡単であり、それが毎日のことです(もちろん、プログラムする場合)。 依存性注入は、コンストラクター、メソッド、またはプロパティを介してオブジェクトに依存性(データ)を渡します。 Joel HooksはInsideRIAの記事 (良い入門記事を読む)に次のように書いています。「変数をクラスコンストラクターに渡すとき、依存性注入を使用します。 クラスにプロパティ値を設定するとき、依存性注入を使用します...



それは楽しいものではありません; ただオフィスを回って、中毒注射をしていることをみんなに伝えることができます。



コンセプトは何ですか


最初はRobotlegsのベストプラクティスでそれについて読みましたが、何も理解できませんでした(これは主にこのデザインパターンに最初に出会ったためであり、もちろんこのドキュメントについて苦情はありません)。 その後、 Hooksの記事を見つけて 「それほど難しくはないのに、どうしてそんなにイライラするのか」と自分に言いましたが、その背後にある概念(理由)についての本当の理解はありませんでした。 理解するために、私はこの記事を読みました 。 この例は、実際には非常に単純で、中毒注射を使用する理由について明確です。



依存性注入を使用する必要がある理由は、主に比more的に、より柔軟なクラスを作成するために重要です。 クラスが変更可能な特定の設定セットを使用し、その動作がこれらのパラメーターに依存する場合は、クラスコードではなく外部にインストールする必要があります。 したがって、設定を変更するたびに、クラスコードに移動して設定を変更しないでください。 あなたは本当にこれに関するFabien Potantier記事を読む必要があります。 彼は私より上手に説明しています。 ジェフモアによるプレゼンテーションも非常に優れています。 読めば読むほど、それがどのように機能するかを理解できるようになります。



結構ですが、それでもRobotlegsマジックのように見えます


依存性注入に関するウィキペディアの記事を読むと、ある場所にいくつかの欠陥がリストされており、そのうちの1つは「依存性注入を使用するコードは一部の開発者にとって魔法のように思えるかもしれません」であり、Robotlegsの文脈でまさにそう感じました。 主に[Inject]メタタグの使用が原因です。 これは、私がAS3で使用するのに慣れているメカニズムではありません。 メタタグは、アドビだけが作成できるような、神聖な祝福されたキーワードだと思いました。



私が間違っていたことがわかりました、まあ、まあ、半分間違っていました。 [Inject]メタタグは実行時に使用され、[Embed]メタタグはコンパイル時に使用されるため、同じ獣ではありません。Robotlegsでは、SwiftSuspendersは注入を処理します。 これは、mapValue、mapClass、およびmapSingletonメソッドを使用して作成したすべてのルールについて、返されるクラスを確認するということです。 これを行うには、クラス(クラス)で定義されているflash.utils.describeType関数を使用し、このクラスを表すXMLを返します。 XMLには、[Inject]メタタグを表すタグが含まれています。 SwiftSuspendersは、XMLを解析するときにクラス表現で検索し、その後、記述されたルールに従って自由に挿入(目的の値を挿入)できます。



もちろん、独自のメタタグを作成することもできますが、判明したように、コンパイラはコンパイル時にそれらを削除するだけです。 SWCの代わりにSwiftSuspendersのソースを使用する場合、コンパイラオプションに追加する必要があります。



-keep-as3-metadata+=Inject -keep-as3-metadata+=PostConstruct // -  ,   SwiftSuspenders
      
      







これにより、コンパイラはクラスからメタタグを削除できなくなります。したがって、これらの行を変更すると、コンパイラは以前に作成したメタタグを保存します。 SWCを使用するときにこれを行うべきではない理由はわかりません。



これは私がカバーできたものです。 依存関係の注入を完全に理解したとはまだ言えませんが、少なくともこの仕組みの仕組みについてはある程度理解しています。 同じように感じることを願っています...



All Articles