新しいシステムを設計していますが、制御の反転(IOC)とは何か、さらに重要なこととして、それをいつ使用するかを知りたいです。
インターフェイスで実装する必要がありますか、それともクラスで実行できますか?
新しいシステムを設計していますが、制御の反転(IOC)とは何か、さらに重要なこととして、それをいつ使用するかを知りたいです。
インターフェイスで実装する必要がありますか、それともクラスで実行できますか?
回答:
IoC(WikipediaのInversion of Controlを参照)は、コンポーネントに必要な情報や機能がないためにコンポーネントがタスクを完全に実行できない場合に適用できます。
IoCパターンの最も単純な例は、Cのコールバック関数です。たとえば、関数を宣言できます。
void Iterator(void *list, Func* f)
各アイテムに関数をlist
適用することを繰り返しf
ます。Iterator
各項目が処理されるのか分からない関数は、あなただけの引数としての機能を提供し、それはそれらを処理します。
前の例が示すように、IoCを使用すると、プログラムを、互いに認識していない個別のコンポーネントに分離できます。最も一般的なバージョンのいずれかIOCがあるDependecyインジェクション。
では依存性注入の各コンポーネントは、それのタスクを実行するために必要な依存関係のリストを宣言する必要があります。実行時に、IoCコンテナと呼ばれる特別なコンポーネント(通常)がこれらのコンポーネント間のバインディングを実行します。公開されたコンポーネントの依存関係の値を提供しようとします。
擬似コードの例を次に示します。
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
この例のクラスにFoo
は、Boo
何らかのアクションを実行するためにタイプの引数を必要とするコンストラクターがあります。
次のFoo
ようなコードを使用して、クラスのインスタンスを作成できます。
MyContainer.Create(typeof Foo)
MyContainer
-はIoC Containerで、インスタンスの取得Boo
とFoo
コンストラクターへの引き渡しを行います。
要約すると、IoCを使用すると、プログラムを個別の部分に分離できます。これは良い理由です:
ただし、場合によっては、IoCによってコードが理解しにくくなることがあります。
IoCの実際の使用例が見たい場合は、Mircosoft Composite UI Application BlockとCompositeWPFをご覧ください
私の説明がお役に立てば幸いです。
よろしく、
aku
最近自分自身でこれを掘り下げて、すべてのブックマークを保持していたので、IOC / DIについて学ぶのに非常に貴重であることがわかりました。
IOC / DIに関するMartin Fowlersのオリジナル記事
独自のIOCの作成方法のソースと説明 -ソースコードの読み取りは、常に概念を理解するための最良の方法です。
ちょっとJMS、基本的にIoC / DIを使用すると、使用する実装を1回定義し、参照するたびに参照するコンテナーの静的コピーを保持できます。
ウィキペディアはおそらくあなたを助けますが、私はあなたの2番目の部分を参照したいと思います-はい、依存性注入はクラスに対して行うことができます(つまり、このクラスタイプをメソッドに渡す必要があるたびに、このクラスを使用します)が、インターフェースを使用します。その方法では、セットアップで再参照するだけで、使用しているプロバイダー、リポジトリなどのバージョンを変更できます。
IE、ストリームを読み込むためのインターフェイスがあり、XMLStreamReaderとSQLStreamReaderの実装があったとしましょう。次に、インターフェイスへの参照をメソッドに渡し、IoCコンテナーで使用するものを指定します。
したがって、パブリックリストReadPeople(IStreamReader reader)を使用して、IStreamReaderがSQLStreamReaderを使用することを期待するたびに、IoCコンテナーのセットアップでそれを指定できます。
その後、後で気が変わった場合は、1か所(コンテナのセットアップ)で変更するだけでよく、IStreamReaderを要求するメソッドの数に関係なく、常にコンテナに指示したデフォルトを取得します。提供する。