- 依存性注入とは、動作を必要とするコンポーネントにコンポーネントを注入することです。
- アスペクト指向プログラミングとは、分野横断的な懸念事項をコードに適用することです (実際には、オープン/クローズドの原則を順守することについてです)。
DI を使用すると、AOP がより自然になります。プロキシを使用してこれを行うことができますが、私の個人的な好みは、古き良きデコレータを適用することです。
AOP のように見え、AOP の匂いがしますが、本格的な AOP フレームワークとは比べ物になりません。
私はこの声明の著者に心から同意しません。私の経験では、PostSharp のようなツールを使用すると、アプリケーションの設計上の欠陥を回避できます。これにより、これらのツールは、レガシー アプリケーションや変更できない設計 (たとえば、INotityPropertyChanged
インターフェイスの処理など) を処理するときに非常に強力になります。ただし、これらのツールを使用すると、設計を修正せずに AOP 機能を追加できますが、これらの設計上の欠陥は、プロジェクトの存続期間中ずっと悩まされます。
簡単な例の 1 つは、テスト容易性です。このようなツールは、依存性注入パターンが解決するアプリケーションのテスト容易性には対応していません。これらのツールはコンパイル時にアスペクトを織り込むため、アスペクトなしでコードをテストすることは非常に困難になります (これは、単体テストを行うときや、場合によっては統合テストを行うときにも行う必要があることです)。コンパイラ ディレクティブを使用して巧妙なトリックを実行する必要がありますが、これは問題の一部を解決するだけです。これらの側面をテストしたいのですが、コードのすべての部分を分離してテストしたいのと同じように、分離してテストしたいからです (それがユニットです)。テストは約です)。解決できたとしても、コードの保守は依然として困難です。その保守不可能なコードは、設計上の欠陥が原因です。
記事の著者は次のように述べています。
最初の問題は、動的プロキシでは、インターフェイスとして公開することを選択したサービスの明示的な境界にのみ側面を追加できることです。プライベート メソッドまたは静的メソッドにアスペクトを追加することはできません。たとえそうしたかったとしてもです。
彼はこれについて完全に正しいですが、private メソッドまたは static メソッドに側面を追加したい場合は、設計に何か問題があります: 設計を修正してください!
2 番目の問題は、より劇的です。AOP のいくつかの利点に夢中になると、依存性注入が必要ない場合でも動的プロキシを使用し始め、動的プロキシの要件のためだけにコードのアーキテクチャを変更します。そして、これは間違っています。AOP では、コードのアーキテクチャを変更する必要はありません。
PostSharp を使用する場合、AOP のアーキテクチャを変更する必要はありません。しかし、デザインが間違っていると、PostSharp などのツールを使用しても、アスペクトを適用することはさらに難しくなります。また、PostSharp を使用した属性のない AOP は、商用バージョンを使用している場合にのみ可能であることを忘れないでください。属性を使用して AOP を適用すると、高い結合とメンテナンスの問題が発生します。すべての DI ツール (少なくとも .NET 用) は無料で使用でき、属性のない使用がデフォルトです。
優れた設計のための代替手段はありません。PostSharp のような正しい設計ツールを使用すると、ほとんどの場合冗長になります。一部のエッジケースでは依然として有益です(これらのケースでは非常に有益です)が、私の経験では、デザインがSOLIDの場合、これらのケースはまれです。
ここで問題は明らかに次のようになります: 優れた SOLID 設計とは? すべてのアプリケーションに適用できる、既製の常に有効な設計などありません。私が設計するすべてのアプリケーションは異なりますが、ここ数年、あなたにも有益かもしれない特定の繰り返しパターンを見てきました。これについては、過去にここ、ここ、およびここに書いています。これらの記事で説明されているパターンは、私が設計と構築を支援する多くのアプリケーションの基本的な構成要素になっています。これらのパターンの重要な要素は SOLID です。