2019/09/02

DIとDIコンテナ

DIを理解していなくてもDIは使える

そもそもこの記事はDI、Dependency Injectionがどうしても理解できないけど不自由なく使ってる人の感想である。特にベースがJava脳なのでJavaのDIを使っている感想。
どのくらい使っているかと言うと書いているソースのほとんどに@Injectionが書かれているくらい毎日使っている。

DIの浅はかな理解

インジェクションする〇〇Serviceと言うクラスは、ぶっちゃけると〇〇Utilsクラスとして作りたいし、全てpublic staticなメソッドとして処理を書きたい。しかし、アプリケーション始動時に動的に読み込む設定などがあり、どうしてもstaticでは作れないクラス。

そんなときにDIコンテナーに渡してやるとアプリケーション全体からstaticインスタンスのように使えるようになる。newを使わずインスタンス化されたインスタンスをインスタンスプールから引っ張り出して使えるようになる。

あっさりとしたまとめ

staticでは作れず、うかつにnewするのも難しいようなクラスがある場合(こういう時、という例は思いつかないが)、
staticクラスにする方法を考えたり、シングルトンにする方法と一緒に、DIコンテナーに登録するという方法を調査してみると良いかもしれない。

おそらくこうかなと思うDIの理解

DI、DIコンテナの利点は「インターフェースとその実装に分けることで本番処理のクラスとモックアップ用のクラスに分けて実装できる」という説明をよく見る。
実際JavaのInterfaceで十分なんじゃ無いかと思ったりして、理解できない。

ではなぜInjectionを毎日のように使うか、というとフレームワークがDIを標準でサポートしているからだ。毎日使っているPlayFrameworkでは、Springのレイヤーモデルである、Controller、Service、Repositoryの相互保有関係をDIで行うことを標準としているからだ。
DIの、Injectionされる側、ServiceクラスやRepositoryクラスのインスタンス化、インスタンスプールへの登録は裏で勝手にやってくれるので@Injectionと書くと自然と使えるようになる。
DIの利点はFramework側の構築で十分に受けており、Frameworkを使って開発する側は、newを使った単なるインスタンス化、staticインスタンスで利用とあまり変わらない意識で使える、ということだろう。

0 件のコメント:

コメントを投稿