0

設定ファイルに型名のリストが格納されている設定ファイルから動的にクラスをインスタンス化するなど、簡単なことをしたいと思っています。Unity Frameworkを使用するべきか、それとも単にActivator.CreateInstanceを使用するべきか疑問に思いました。主な違いは何ですか?

私がやりたいことのサンプル:

LIST myList = Config.GetSection... blah blah

foreach(item in in mylist) {
   IPlugIn x = (IPlugIn)Activator.CreateInstance(item.myPlugInTypeFromConfig,myassembly);

   x.Start(); 
}

私の場合、Unity Frameworkは必要なく、アクティベーターだけでうまくいくようです。

4

2 に答える 2

3

基本的な違いは、Unity (または任意の DI コンテナー) が実際に依存関係を管理できることです。Activator.CreateInstance はインスタンスを作成するだけです。

コンストラクター パラメーターを持つ型と持たない型がある場合はどうなるでしょうか。または設定したいプロパティ?コンテナーは、オブジェクト グラフを再帰的に調べて、それらのコンストラクターのパラメーターまたはプロパティにどの値を入れる必要があるかを判断します。Activator.CreateInstance はそれを行いません。

コンテナーは、オブジェクトの有効期間を管理します。一部の型について、型 A には常に同じインスタンスが必要であるが、型 B には型ごとに新しいインスタンスが必要な場合はどうすればよいでしょうか? コンテナーでこれを行うのは簡単です。Activator.CreateInstance については自分で行う必要があります。

「構成ファイルからパラメーターなしでこのタイプのリストを新たに作成する」だけであれば、コンテナーは必要ありません。それを超えると、コンテナはより多くのパワーをテーブルにもたらします。

于 2012-08-13T17:05:32.987 に答える
1

コンポーネントを利用するクラスが多数ある場合は、Unityを使用することをお勧めします。このような場合、依存性注入はコンストラクター時に発生します。

ただし、プラグインアーキテクチャのリポジトリであるIMHOではありません。1つの例外を除いて、(キャストとアセンブリ名が必要ですが)問題なく実行する必要があることを実行しているように見えます。プラグインアーキテクチャは通常、ConfigurationManagerを使用してプラグインのロードを制御します。

このタイプのアーキテクチャに関する本当に良い記事については、ドブス博士に関するこの記事を読むことができます。

于 2012-08-13T15:04:28.563 に答える